Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 11.01.2010
Сообщений: 51
1

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

14.06.2014, 17:47. Показов 851. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Код класса:
Кликните здесь для просмотра всего текста

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 ==========
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.06.2014, 17:47
Ответы с готовыми решениями:

Перегрузка оператора +=
Создал класс дробь. Пытаюсь перегрузить оператор += (или -=, *=, /=) А компилятор выдаёт ошибку...

Перегрузка оператора []
Возможно ли создать два перегруженных оператора индексации, чтобы один из них возвращал l-value,...

Перегрузка оператора --
Добрый день, у меня возникла небольшая проблема. Дело в том, что display() работает нормально....

Перегрузка оператора +
Здравствуйте. Пытаюсь перегрузить оператор сложения, но выдаёт ошибку. Задача в том, чтобы сложить...

10
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
15.06.2014, 05:05 2
То, что объявлено в классе не имеет отношения к тому, что реализовано, и наоборот (касается и оператора +). Закоментируйте то, что в классе.
0
1 / 1 / 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>&);
То есть мне никак не нужно в классе говорить, что будет перегружено?
0
Модератор
Эксперт С++
13505 / 10756 / 6411
Регистрация: 18.12.2011
Сообщений: 28,711
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&);
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
15.06.2014, 17:47 5
Цитата Сообщение от satisfactor Посмотреть сообщение
То есть мне никак не нужно в классе говорить, что будет перегружено?
Зачем? Это не в классе перегрузка.
0
1 / 1 / 3
Регистрация: 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);   
}
Заранее спасибо!!!
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
12.07.2014, 19:09 7
Цитата Сообщение от arzhanok Посмотреть сообщение
прошу объяснить как работает следующий фрагмент кода:
5. цикл по элементам массива data.
6. если элемент не совпал с буквой letter, то
7. копируем его в temp
9. перенос из temp в data.
1
1 / 1 / 3
Регистрация: 10.07.2014
Сообщений: 38
12.07.2014, 19:15 8
спасибо!а 8 строка зачем? без нее тоже работает...
0
Модератор
Эксперт С++
13505 / 10756 / 6411
Регистрация: 18.12.2011
Сообщений: 28,711
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
2
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
12.07.2014, 19:52 10
Цитата Сообщение от zss Посмотреть сообщение
C++
1
temp[j]=NULL; // ставим терминальный нуль
Кстати, вот здесь следовало бы писать не NULL, который характеризует нулевой указатель, а скорее всего '\0' или просто 0. С точки зрения компилятора разницы никакой, но по смыслу в строке всё же хранятся символы, а не указатели.
1
1 / 1 / 3
Регистрация: 10.07.2014
Сообщений: 38
12.07.2014, 20:22 11
компилятор (с null) просто предупреждение выдает :
[Warning] converting to non-pointer type `char' from NULL , а с 0 - все чисто. Спасибо!
0
12.07.2014, 20:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.07.2014, 20:22
Помогаю со студенческими работами здесь

Перегрузка оператора <<
Добрый пень! подскажите как написать код для реалилизации следующего требования: SpecialPrint...

Перегрузка оператора +
Всем добрый вечер. Прошу помочь разобраться. Задание - Для определения даты поставки строительных...

Перегрузка оператора ‘=’
Подскажите, пожалуйста, можно ли как-то перегрузить оператор равно. Чтобы можно было его...

перегрузка оператора +
Не могу понять: в 184 строке отказывается работать. Без нее - все нормально. Скорее всего...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru