Форум программистов, компьютерный форум CyberForum.ru

Перегрузка оператора << - C++

Восстановить пароль Регистрация
 
satisfactor
0 / 0 / 0
Регистрация: 11.01.2010
Сообщений: 51
14.06.2014, 17:47     Перегрузка оператора << #1
Код класса:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <iostream>
#include <cstdlib>
#include <cassert>
 
#ifndef ARRAY_H
#define ARRAY_H
 
template< class T, class T1 >
class Array{
    friend std::ostream& operator<< ( std::ostream&, Array& );
    friend Array operator+ (Array&, Array&);
public:
    //overload
    T& operator[] ( T1 );                                                       //[] not const
    T& operator[] ( T1 ) const;
    //constructors
    Array( T1 = 1 );
    Array( Array< T, T1 > & );
    //get
    T1 getSize( void ) const;
    //add
    void addArray( const Array< T, T1 >& );
    //another
    std::ostream& show( char, std::ostream & = std::cout );
    //destructor
    ~Array();
private:
    T* data;
    T1 size;
};
 
//constructor
template< class T, class T1 >
Array< T, T1 >::Array( T1 num_of_elements ) {
    assert( num_of_elements > 0 );
    size = num_of_elements;
    data = (T*)realloc( NULL, sizeof(T)*size );
}
 
template< class T, class T1 >
Array< T, T1 >::Array( Array< T, T1 >& ref ) {
    size = ref.getSize();
    data = (T*)realloc(NULL, sizeof(T)*size);
    assert(data!=0);
    //copy
    for ( T1 i = 0; i < size; i++ )
        data[i] = ref[i];
}
 
//add
template< class T, class T1 >
void Array< T, T1 >::addArray( const Array< T, T1 >& ref ) {
    T1 buffer = size;
    size += ref.getSize();
    data = (T*)realloc( data, sizeof(T)*size );
    assert( data != 0 );
    //copy elements
    for (;buffer < size; buffer++) {
        data[buffer] = ref[buffer-ref.getSize()+1];
    }
}
 
//get
template< class T, class T1 >
T1 Array< T, T1 >::getSize( void ) const {
    return size;
}
 
//another
template< class T, class T1 >
std::ostream& Array< T, T1 >::show( char space, std::ostream & output) {
    for ( T1 i = 0; i < size; i++ )
        if ( i < size - 1 )
            output << data[i] << space;
        else
            output << data[i];
 
    return output;
}
 
//overloads
template< class T, class T1 >
std::ostream& operator<< ( std::ostream& output, Array< T, T1 >& ref ){
    return (ref.show(output.fill(), output));
}
 
template< class T, class T1 >
Array< T, T1 > operator+ ( Array< T, T1 >& a1, Array< T, T1 >& a2 ){
    Array< T, T1 > result( a1 );
    result.addArray( a2 );
    return result;
}
 
template< class T, class T1 >
T& Array< T, T1 >::operator[] ( T1 index ) {
    assert( index >= 0 && index < size );
    return data[index];
}
 
template< class T, class T1 >
T& Array< T, T1 >::operator[] ( T1 index ) const {
    assert( index >= 0 && index < size );
    return data[index];
}
 
//destructor
template< class T, class T1 >
Array< T, T1 >::~Array(){
    if (size == 1)
        delete data;
    else
        delete [] data;
}
 
#endif


Код main
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
using std::cout;
using std::endl;
using std::cin;
 
#include "Array.h"
 
int main( void ) {
    Array<int, int> a(2);
    a[0] = 1;
    a[1] = 2;
    Array<int, int> b(3);
    b[0] = 3;
    b[1] = 4;
    b[2] = 5;
 
    Array<int, int> c(a);
    c.addArray(b);
 
 
    cout << a;
 
    cin.get();
    cin.get();
    return 0;
}


И, собственно, ошибка (Visual Studio Express 2010):
Код
1>------ Построение начато: проект: Array, Конфигурация: Debug Win32 ------
1>  Пропуск... (изменения не обнаружены)
1>  Array.cpp
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Array<int,int> &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$Array@HH@@@Z) в функции _main
1>C:\Users\Sunday\Desktop\test_project\Array\Debug\Array.exe : fatal error LNK1120: 1 неразрешенных внешних элементов
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2014, 17:47     Перегрузка оператора <<
Посмотрите здесь:

C++ Перегрузка оператора %
Перегрузка оператора = C++
Перегрузка оператора C++
C++ перегрузка оператора
C++ Перегрузка оператора
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.06.2014, 05:05     Перегрузка оператора << #2
То, что объявлено в классе не имеет отношения к тому, что реализовано, и наоборот (касается и оператора +). Закоментируйте то, что в классе.
satisfactor
0 / 0 / 0
Регистрация: 11.01.2010
Сообщений: 51
15.06.2014, 17:35  [ТС]     Перегрузка оператора << #3
Закомментировал
C++
1
2
    //friend std::ostream& operator<< ( std::ostream&, Array< T, T1>& );
    //friend Array operator+ (Array< T, T1>&, Array< T, T1>&);
То есть мне никак не нужно в классе говорить, что будет перегружено?
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,155
Завершенные тесты: 1
15.06.2014, 17:41     Перегрузка оператора << #4
Чтобы операторы имели доступ к защищенным данным класса Array, их надо объявить, но чуть по другому:
C++
1
2
    friend std::ostream& operator<< <T,T1> ( std::ostream&, Array& );
    friend Array operator+ <T,T1>(Array&, Array&);
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.06.2014, 17:47     Перегрузка оператора << #5
Цитата Сообщение от satisfactor Посмотреть сообщение
То есть мне никак не нужно в классе говорить, что будет перегружено?
Зачем? Это не в классе перегрузка.
arzhanok
1 / 1 / 1
Регистрация: 10.07.2014
Сообщений: 38
12.07.2014, 18:58     Перегрузка оператора << #6
добрый день!
в классе перегружаю операторы "+" и "-"
имею такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
using namespace std;
class man
{
      public:
             man(char *);
             void operator + (char *);
             void operator - (char);
             void show();
      private:
              char data[100];             
};
void man::operator - (char letter)
{
    char temp[100];
    int i,j;
    for(i=0,j=0;data[i];i++)
    if (data[i]!=letter)
       temp[j++]=data[i];
       temp[j]=NULL;
    strcpy(data,temp);   
}
man::man(char *str)
{
   strcpy(data,str);
}
void man::operator + (char *str)
{
  strcat(data,str);   
}
void man::show ()
{
     cout<<data<<endl;
}
int main(void)
{ 
     setlocale (0,"");
     man sasha("sasha");
     sasha.show();
     sasha+" love masha";
     sasha.show();
     sasha.operator - ('l');
     sasha.show();
     system ("PAUSE");
}
все работает. прошу объяснить как работает следующий фрагмент кода:
C++
1
2
3
4
5
6
7
8
9
10
void man::operator - (char letter)
{
    char temp[100];
    int i,j;
    for(i=0,j=0;data[i];i++)
    if (data[i]!=letter)
       temp[j++]=data[i];
       temp[j]=NULL;
    strcpy(data,temp);   
}
Заранее спасибо!!!
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.07.2014, 19:09     Перегрузка оператора << #7
Цитата Сообщение от arzhanok Посмотреть сообщение
прошу объяснить как работает следующий фрагмент кода:
5. цикл по элементам массива data.
6. если элемент не совпал с буквой letter, то
7. копируем его в temp
9. перенос из temp в data.
arzhanok
1 / 1 / 1
Регистрация: 10.07.2014
Сообщений: 38
12.07.2014, 19:15     Перегрузка оператора << #8
спасибо!а 8 строка зачем? без нее тоже работает...
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,155
Завершенные тесты: 1
12.07.2014, 19:15     Перегрузка оператора << #9
Оператор из строки data удаляет все буквы letter
C++
1
2
3
4
5
 for(i=0,j=0;data[i];i++)// проходим по всей строки до терминального нуля(data[i]=0) 
    if (data[i]!=letter)
       temp[j++]=data[i]; // если очередной символ не letter, то копируем
       temp[j]=NULL; // ставим терминальный нуль
    strcpy(data,temp); // получившуюся строку копируем  в data
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.07.2014, 19:52     Перегрузка оператора << #10
Цитата Сообщение от zss Посмотреть сообщение
C++
1
temp[j]=NULL; // ставим терминальный нуль
Кстати, вот здесь следовало бы писать не NULL, который характеризует нулевой указатель, а скорее всего '\0' или просто 0. С точки зрения компилятора разницы никакой, но по смыслу в строке всё же хранятся символы, а не указатели.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2014, 20:22     Перегрузка оператора <<
Еще ссылки по теме:

C++ Перегрузка оператора ++
Перегрузка оператора *= C++
C++ Перегрузка оператора ++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
arzhanok
1 / 1 / 1
Регистрация: 10.07.2014
Сообщений: 38
12.07.2014, 20:22     Перегрузка оператора << #11
компилятор (с null) просто предупреждение выдает :
[Warning] converting to non-pointer type `char' from NULL , а с 0 - все чисто. Спасибо!
Yandex
Объявления
12.07.2014, 20:22     Перегрузка оператора <<
Ответ Создать тему
Опции темы

Текущее время: 05:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru