Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
7 / 7 / 9
Регистрация: 25.02.2013
Сообщений: 237

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

08.03.2014, 15:34. Показов 3232. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу класс My_String

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
#include <iostream>
const int MAX = 1000;
 
class My_String
{
private:
    char str[MAX];
public:
    My_String()
    {
        strcpy(str, "");
    }
 
    ~My_String()
    {
 
    }
 
    void operator+(char *s)
    {
        strcat(str, s);
    }
 
    void operator=(char *s)
    {
        strcpy(str, s);
    }
    
    void operator<<(char *s)
    {
        cout<<s;
    }
};
как правильно перегрузить оператор << для вывода объекта?

C++
1
2
stt="5";
 cout<<stt;
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.03.2014, 15:34
Ответы с готовыми решениями:

Перегрузка оператора []
Всем привет! Как можно перегрузить оператор так, чтобы к нему можно было обращаться так: class_arr = 5; Где class_arr - переменная...

Перегрузка оператора ==
нужно сравнить 1) объект класса abc с объектом класса abc1 2) объект класса abc с другим объектом класса abc 3) объект класса abc1...

Перегрузка оператора +
String String::operator + (String &amp; sg2) { String tmp; tmp.str = new char ; strcpy (tmp.str, str); strcat (tmp.str, sg2.str);...

19
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
08.03.2014, 15:39
C++
1
2
3
4
5
ostream& operator<<(ostream& os,const My_String& ms)
{
     os<<ms.str<<endl;
     return os;
}
Эта функция не является членом класса My_String, только не забудьте добавить ее в друзья класса My_String.
1
7 / 7 / 9
Регистрация: 25.02.2013
Сообщений: 237
08.03.2014, 15:48  [ТС]
можете написать, как оно должно быть написано?
0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
08.03.2014, 15:59
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class My_String
{
private:
    char str[MAX];
public:
   friend ostream& operator<<(ostream& os,const My_String& ms);
...
};
ostream& operator<<(ostream& os,const My_String& ms)
{
     os<<ms.str<<endl;
     return os;
}
int main()
{
...
1
7 / 7 / 9
Регистрация: 25.02.2013
Сообщений: 237
08.03.2014, 19:29  [ТС]
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
//myString.h
 
#include <iostream>
using namespace std;
const int MAX_SIZE = 255;
 
class myString
{
private:
    char str[255];
public:
    myString(void);
    myString(char[]);
    ~myString(void);
    void operator+(char[]);
    void operator=(char[]);
    friend ostream& operator<<(ostream& os,const myString& ms);
};
 
 
//myString.cpp
#include "myString.h"
#include "string.h"
 
myString::myString(void)
{
    strcpy(str, "");
}
 
 
myString::~myString(void)
{
}
 
void myString::operator+(char s[])
{
    strcat(str, s);
}
 
void myString::operator=(char s[])
{
    strcpy(str, s);
}
 
ostream& operator<<(ostream& os,const myString& ms)
{
     os<<ms.str<<endl;
     return os;
}
 
//main.cpp
#include "myString.h"
#include <conio.h>
#include <iostream>
using namespace std;
 
int main()
{
    myString str1("Hello");
    cout<<str1;
 
    _getch();
}
Не компилируется. Вот такая ошибка
Code
1
error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall myString::myString(char * const)" (??0myString@@QAE@QAD@Z) в функции _main
0
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
08.03.2014, 19:40
Praud, у тебя отсутствует реализация конструктора: myString(char[]);
0
7 / 7 / 9
Регистрация: 25.02.2013
Сообщений: 237
08.03.2014, 23:43  [ТС]
всё, увидел) спасибо, завтыкал))

Добавлено через 3 часа 50 минут
Теперь нужно тоже самое сделать только для cin>>

Поможете ?
0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
09.03.2014, 09:24
C++
1
    friend istream& operator>>(istream& is,myString& ms);
Думаю, код сумеете написать по аналогии
0
7 / 7 / 9
Регистрация: 25.02.2013
Сообщений: 237
09.03.2014, 12:33  [ТС]
Написал вот так вот:

C++
1
2
3
4
5
6
7
8
9
istream& operator>>(istream& os, myString& ms)
{
    char BUFF[2048];
 
    os.getline(BUFF, sizeof BUFF);
    ms = BUFF;
 
    return os;
}
Теперь проблема.
C++
1
2
3
4
5
6
7
int n;
cin>>n;
cout<<n;
 
myString q;
cin>>q;
cout<<q;
Вот при таком коде, вводится только одна из переменных. Второй cin компилятор просто игнорирует, хотя по отдельности(если один из них убрать) они работают. Почему так происходит?
0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
09.03.2014, 12:43
Наступаете на одни те же грабли.
После ввода числа по cin>>n указатель потока остается на последнем
пробельном символе (в данном случае на конце строки).
и cin>>q считывает этот конец строки.
Я обычно дублирую эту команду, чтобы особо не заморачиваться:
C++
1
2
3
4
5
6
7
8
int n;
cin>>n;
cout<<n;
 
myString q;
cin>>q;
cin>>q;
cout<<q;
0
7 / 7 / 9
Регистрация: 25.02.2013
Сообщений: 237
09.03.2014, 17:57  [ТС]
Спасибо.
Теперь нужно перегрузить тот же оператор <<, для вывода в стандартный поток, как написано выше, вот только это теперь не должна быть friend функция.

Вот, что написано в лабе:
Перегруженные операции-методы класса:
<< вывод значения контейнера в стандартный поток вывода

собственно, как обойтись без friend?
0
 Аватар для noname_club
112 / 103 / 12
Регистрация: 01.05.2013
Сообщений: 603
09.03.2014, 18:12
Перегрузка оператора << / С++ для начинающих
вообще любая перегрузка операторов не кросс платформенна и влечет только одни проблемы.

Используйте более безопасные методы передачи параметров.

Я понимаю что лень это двигатель прогресса. Но ведь для этого есть макросы #define мощь которых безгранична так как они могут быть многострочными. Начиная от foreach циклов заканчиная макроподстановкой методов в классы вместо написания оных.
0
7 / 7 / 9
Регистрация: 25.02.2013
Сообщений: 237
09.03.2014, 18:17  [ТС]
Я думаю если я скажу это преподавателю он меня пошлет и только ) так что написать надо )
1
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
09.03.2014, 19:30
чтобы метод operator<< был не friend надо для каждой защищенной переменной
написать метод, возвращающий ее значение
C++
1
2
3
4
5
6
7
char* GetStr() const { return str;}
....
ostream& operator<<(ostream& os,const My_String& ms)
{
     os<<ms.GetStr()<<endl;
     return os;
}
0
13 / 11 / 3
Регистрация: 22.11.2013
Сообщений: 127
09.03.2014, 19:59
Теперь проблема.

C++
1
2
3
4
5
6
7
int n;
cin>>n;
cout<<n;
 
myString q;
cin>>q;
cout<<q;
Вот при таком коде, вводится только одна из переменных. Второй cin компилятор просто игнорирует, хотя по отдельности(если один из них убрать) они работают. Почему так происходит?
А попробуйте так
C++
1
2
3
4
5
6
7
int n;
cin>>n;
cout<<n;
cin.sync(); 
myString q;
cin>>q;
cout<<q;
а если сработает, то можна "cin.sync();" вставить в функцию или конструктор, чтобы каждый раз не писать в коде...
0
7 / 7 / 9
Регистрация: 25.02.2013
Сообщений: 237
15.03.2014, 20:30  [ТС]
чтобы метод operator<< был не friend надо для каждой защищенной переменной
написать метод, возвращающий ее значение

есть проблема. Если не делать этот метод дружественным, то он принимает только 1 значение. Как быть?

Добавлено через 2 часа 3 минуты
C++
1
2
3
4
5
6
ostream& Stack::operator<<(ostream& os)
{
    for (int i = 0; i < size; ++i)
        os << this->st[i] << " ";
        return os;
}
Написал вот так вот, но теперь надо в maine писать a<<cout Как сделать наоборот?
0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
15.03.2014, 22:00
ostream& Stack::operator<<(ostream& os)
НЕЛЬЗЯ сделать членом класса в привычном виде,
т.к. вызывать его надо будет так:
C++
1
Объект_класса<<Потоковый_объект;
(т.е. то что слева - это объект для которого вызван оператор (*this),
а справа - то, что в скобках).

Можете, конечно, взломать библиотеку STL и включить в класс ostream
ostream& ostream::operator<<(Stack);
0
7 / 7 / 9
Регистрация: 25.02.2013
Сообщений: 237
15.03.2014, 22:16  [ТС]
Странно. Мы только на курсе начали изучать cpp. Вот что сказано в задании
Перегруженные операции-методы класса:
- удаление элемента;
[] индексирование;
= копирование;
<< вывод значения контейнера в стандартный поток вывода
Перегруженные операции-друзья класса:
+ добавление элемента;
== отношение равенства;
> отношение порядка;

Я ведь правильно понял, что стандартный поток - cout?
0
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
15.03.2014, 22:24
А при чем здесь стандартный поток.
Вы перегружаете оператор вывода для всего класса ostream.
Менять ostream дело неблагородное.
Остается единственная альтернатива - применять глобальный оператор
сделав его дружественным.
0
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
15.03.2014, 23:03
Praud, присоединяюсь к zss, у тебя скорее всего ошибка в задании.
Когда ты пишешь какой-либо метод класса, например
C++
1
2
3
4
5
class A
{
public:
    void foo(int a);
};
то его семантика соответствует вот такой функции:
C++
1
void foo(A & this_, int a);
то есть когда ты перегружаешь оператор << как метод класса, то он при становится семантически эквивалентен такой функции:
C++
1
ostream& operator<<(Stack & this_, ostream & os);
что воспрепятствует попытке его вызвать требуемым способом, потому что первым аргументом должен быть объект ostream, например std::cout, а у нас все наоборот.
Так что такая функция для правильной работы должна быть свободной, даже не обязательно дружественной при этом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.03.2014, 23:03
Помогаю со студенческими работами здесь

Перегрузка оператора []
Здравствуйте. Пробую перегрузить оператор . template &lt;class Element&gt; class List { public: struct Node { Element el; ...

Перегрузка оператора
Доброго времени суток. Столкнулся с проблемой перегрузки оператора &quot;++&quot; выдает ошибку в первой строке: postfix ‘const Counter...

Перегрузка оператора +
Добрый день, товарищи программиста. Вопрос такой. Я перезагружаю оператор + на языку с++, и написал класс и метод class Complex ...

Перегрузка оператора ()
кто может подсказать как создать перегрузку что бы можно было работать с амссивввом в таком ввиде mass(3)=2 а не mass=2; если можно...

Перегрузка оператора -=
Добрый день, товарищи программиста. Вопрос такой. у перезагружаю оператор -= на языку с++, и написал класс и метод const double...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru