1 / 1 / 0
Регистрация: 11.01.2010
Сообщений: 51

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

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

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

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):
Code
1
2
3
4
5
6
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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.06.2014, 17:47
Ответы с готовыми решениями:

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

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

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

10
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
15.06.2014, 05:05
То, что объявлено в классе не имеет отношения к тому, что реализовано, и наоборот (касается и оператора +). Закоментируйте то, что в классе.
0
1 / 1 / 0
Регистрация: 11.01.2010
Сообщений: 51
15.06.2014, 17:35  [ТС]
Закомментировал
C++
1
2
    //friend std::ostream& operator<< ( std::ostream&, Array< T, T1>& );
    //friend Array operator+ (Array< T, T1>&, Array< T, T1>&);
То есть мне никак не нужно в классе говорить, что будет перегружено?
0
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,236
15.06.2014, 17:41
Чтобы операторы имели доступ к защищенным данным класса Array, их надо объявить, но чуть по другому:
C++
1
2
    friend std::ostream& operator<< <T,T1> ( std::ostream&, Array& );
    friend Array operator+ <T,T1>(Array&, Array&);
1
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
15.06.2014, 17:47
Цитата Сообщение от satisfactor Посмотреть сообщение
То есть мне никак не нужно в классе говорить, что будет перегружено?
Зачем? Это не в классе перегрузка.
0
1 / 1 / 3
Регистрация: 10.07.2014
Сообщений: 38
12.07.2014, 18:58
добрый день!
в классе перегружаю операторы "+" и "-"
имею такой код:
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
Цитата Сообщение от arzhanok Посмотреть сообщение
прошу объяснить как работает следующий фрагмент кода:
5. цикл по элементам массива data.
6. если элемент не совпал с буквой letter, то
7. копируем его в temp
9. перенос из temp в data.
1
1 / 1 / 3
Регистрация: 10.07.2014
Сообщений: 38
12.07.2014, 19:15
спасибо!а 8 строка зачем? без нее тоже работает...
0
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,236
12.07.2014, 19:15
Оператор из строки 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
Цитата Сообщение от zss Посмотреть сообщение
C++
1
temp[j]=NULL; // ставим терминальный нуль
Кстати, вот здесь следовало бы писать не NULL, который характеризует нулевой указатель, а скорее всего '\0' или просто 0. С точки зрения компилятора разницы никакой, но по смыслу в строке всё же хранятся символы, а не указатели.
1
1 / 1 / 3
Регистрация: 10.07.2014
Сообщений: 38
12.07.2014, 20:22
компилятор (с null) просто предупреждение выдает :
[Warning] converting to non-pointer type `char' from NULL , а с 0 - все чисто. Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.07.2014, 20:22
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru