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

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

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

Author24 — интернет-сервис помощи студентам
Пишу класс 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.03.2014, 15:34
Ответы с готовыми решениями:

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

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

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

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

19
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
08.03.2014, 15:39 2
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  [ТС] 3
можете написать, как оно должно быть написано?
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
08.03.2014, 15:59 4
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  [ТС] 5
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();
}
Не компилируется. Вот такая ошибка
Код
error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall myString::myString(char * const)" (??0myString@@QAE@QAD@Z) в функции _main
0
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
08.03.2014, 19:40 6
Praud, у тебя отсутствует реализация конструктора: myString(char[]);
0
7 / 7 / 9
Регистрация: 25.02.2013
Сообщений: 237
08.03.2014, 23:43  [ТС] 7
всё, увидел) спасибо, завтыкал))

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

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

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
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
09.03.2014, 12:43 10
Наступаете на одни те же грабли.
После ввода числа по 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  [ТС] 11
Спасибо.
Теперь нужно перегрузить тот же оператор <<, для вывода в стандартный поток, как написано выше, вот только это теперь не должна быть friend функция.

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

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

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

Я понимаю что лень это двигатель прогресса. Но ведь для этого есть макросы #define мощь которых безгранична так как они могут быть многострочными. Начиная от foreach циклов заканчиная макроподстановкой методов в классы вместо написания оных.
0
7 / 7 / 9
Регистрация: 25.02.2013
Сообщений: 237
09.03.2014, 18:17  [ТС] 13
Я думаю если я скажу это преподавателю он меня пошлет и только ) так что написать надо )
1
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
09.03.2014, 19:30 14
чтобы метод 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 15
Теперь проблема.

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  [ТС] 16
чтобы метод 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
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
15.03.2014, 22:00 17
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  [ТС] 18
Странно. Мы только на курсе начали изучать cpp. Вот что сказано в задании
Перегруженные операции-методы класса:
- удаление элемента;
[] индексирование;
= копирование;
<< вывод значения контейнера в стандартный поток вывода
Перегруженные операции-друзья класса:
+ добавление элемента;
== отношение равенства;
> отношение порядка;

Я ведь правильно понял, что стандартный поток - cout?
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
15.03.2014, 22:24 19
А при чем здесь стандартный поток.
Вы перегружаете оператор вывода для всего класса ostream.
Менять ostream дело неблагородное.
Остается единственная альтернатива - применять глобальный оператор
сделав его дружественным.
0
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
15.03.2014, 23:03 20
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
15.03.2014, 23:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.03.2014, 23:03
Помогаю со студенческими работами здесь

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

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

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

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


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

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