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

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

Восстановить пароль Регистрация
 
Praud
7 / 7 / 3
Регистрация: 25.02.2013
Сообщений: 233
08.03.2014, 15:34     Перегрузка оператора << #1
Пишу класс 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;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2014, 15:34     Перегрузка оператора <<
Посмотрите здесь:

C++ Перегрузка оператора %
Перегрузка оператора = C++
Перегрузка оператора C++
C++ перегрузка оператора
C++ Перегрузка оператора
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,171
Завершенные тесты: 1
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.
Praud
7 / 7 / 3
Регистрация: 25.02.2013
Сообщений: 233
08.03.2014, 15:48  [ТС]     Перегрузка оператора << #3
можете написать, как оно должно быть написано?
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,171
Завершенные тесты: 1
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()
{
...
Praud
7 / 7 / 3
Регистрация: 25.02.2013
Сообщений: 233
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
DrOffset
6426 / 3800 / 880
Регистрация: 30.01.2014
Сообщений: 6,594
08.03.2014, 19:40     Перегрузка оператора << #6
Praud, у тебя отсутствует реализация конструктора: myString(char[]);
Praud
7 / 7 / 3
Регистрация: 25.02.2013
Сообщений: 233
08.03.2014, 23:43  [ТС]     Перегрузка оператора << #7
всё, увидел) спасибо, завтыкал))

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

Поможете ?
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,171
Завершенные тесты: 1
09.03.2014, 09:24     Перегрузка оператора << #8
C++
1
    friend istream& operator>>(istream& is,myString& ms);
Думаю, код сумеете написать по аналогии
Praud
7 / 7 / 3
Регистрация: 25.02.2013
Сообщений: 233
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 компилятор просто игнорирует, хотя по отдельности(если один из них убрать) они работают. Почему так происходит?
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,171
Завершенные тесты: 1
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;
Praud
7 / 7 / 3
Регистрация: 25.02.2013
Сообщений: 233
09.03.2014, 17:57  [ТС]     Перегрузка оператора << #11
Спасибо.
Теперь нужно перегрузить тот же оператор <<, для вывода в стандартный поток, как написано выше, вот только это теперь не должна быть friend функция.

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

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

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

Я понимаю что лень это двигатель прогресса. Но ведь для этого есть макросы #define мощь которых безгранична так как они могут быть многострочными. Начиная от foreach циклов заканчиная макроподстановкой методов в классы вместо написания оных.
Praud
7 / 7 / 3
Регистрация: 25.02.2013
Сообщений: 233
09.03.2014, 18:17  [ТС]     Перегрузка оператора << #13
Я думаю если я скажу это преподавателю он меня пошлет и только ) так что написать надо )
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,171
Завершенные тесты: 1
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;
}
Bino321
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 31
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();" вставить в функцию или конструктор, чтобы каждый раз не писать в коде...
Praud
7 / 7 / 3
Регистрация: 25.02.2013
Сообщений: 233
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 Как сделать наоборот?
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,171
Завершенные тесты: 1
15.03.2014, 22:00     Перегрузка оператора << #17
ostream& Stack::operator<<(ostream& os)
НЕЛЬЗЯ сделать членом класса в привычном виде,
т.к. вызывать его надо будет так:
C++
1
Объект_класса<<Потоковый_объект;
(т.е. то что слева - это объект для которого вызван оператор (*this),
а справа - то, что в скобках).

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

Я ведь правильно понял, что стандартный поток - cout?
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,171
Завершенные тесты: 1
15.03.2014, 22:24     Перегрузка оператора << #19
А при чем здесь стандартный поток.
Вы перегружаете оператор вывода для всего класса ostream.
Менять ostream дело неблагородное.
Остается единственная альтернатива - применять глобальный оператор
сделав его дружественным.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2014, 23:03     Перегрузка оператора <<
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
DrOffset
6426 / 3800 / 880
Регистрация: 30.01.2014
Сообщений: 6,594
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, а у нас все наоборот.
Так что такая функция для правильной работы должна быть свободной, даже не обязательно дружественной при этом.
Yandex
Объявления
15.03.2014, 23:03     Перегрузка оператора <<
Ответ Создать тему
Опции темы

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