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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Praud
7 / 7 / 3
Регистрация: 25.02.2013
Сообщений: 237
#1

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

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

Перегрузка оператора == - C++
Пытаюсь перегрузить оператор == . Делаю так: В классе: class cData // класс дата { int year; // год short mounth; //...

Перегрузка оператора -> - C++
Для чего она вообще и как её использовать? Черканите, если не трудно, &quot;детский&quot; примерчик !

Перегрузка оператора ++ - C++
Нужно создать операторы префиксного и постфиксного инкремента для приращения переменной itsRadius класса SimpleCircle. Переменная itsRadius...

Перегрузка оператора - C++
Доброго времени суток! Помогите, пожалуйста, с решением задачи: Описать класс множество целых чисел. Перегрузить следующую операцию: +...

Перегрузка оператора = - C++
Есть некий класс. И два класса-наследника. Надо перегрузить оператор =, к тому же в дочерних классах вызывать перегрузку в базовом классе....

Перегрузка оператора = - C++
Здравствуйте, возникла проблема при перегрузке оператора. const digit &amp;operator=( const int &amp; ); const digit &amp;operator=( const char...

Перегрузка оператора ~ - C++
Доброго времени суток! Помогите пожалуйста с решением задачи. Описать класс множество целых чисел. Перегрузить следующую операцию: ~...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,184
Завершенные тесты: 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
Сообщений: 237
08.03.2014, 15:48  [ТС]     Перегрузка оператора << #3
можете написать, как оно должно быть написано?
zss
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,184
Завершенные тесты: 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
Сообщений: 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
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
08.03.2014, 19:40     Перегрузка оператора << #6
Praud, у тебя отсутствует реализация конструктора: myString(char[]);
Praud
7 / 7 / 3
Регистрация: 25.02.2013
Сообщений: 237
08.03.2014, 23:43  [ТС]     Перегрузка оператора << #7
всё, увидел) спасибо, завтыкал))

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

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

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

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

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

Я понимаю что лень это двигатель прогресса. Но ведь для этого есть макросы #define мощь которых безгранична так как они могут быть многострочными. Начиная от foreach циклов заканчиная макроподстановкой методов в классы вместо написания оных.
Praud
7 / 7 / 3
Регистрация: 25.02.2013
Сообщений: 237
09.03.2014, 18:17  [ТС]     Перегрузка оператора << #13
Я думаю если я скажу это преподавателю он меня пошлет и только ) так что написать надо )
zss
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,184
Завершенные тесты: 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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2014, 19:59     Перегрузка оператора <<
Еще ссылки по теме:

Перегрузка оператора - C++
Здравствуйте! Помогите разобраться с перегрузкой операторов. Суть задания: Осуществите перегрузку оператора “++” так, чтобы при его...

Перегрузка оператора + - C++
Всем привет, проблема на этот раз такая. Для того, чтобы выучить классы, я пишу некое подобие класса string. Сложность вот в чем. Возникла...

Перегрузка оператора ++ - C++
Написал префиксную перегрузку ++ Vremya &amp;Vremya::operator ++ () { int sec = getSec(*this); //перевод в секунды ...

Перегрузка оператора - C++
Имеется время, например 12:12:12 Перегрузка инкремента Time &amp;Time::operator ++ () { Next(); return *this; } ...

Перегрузка оператора >> - C++
Не понимаю, в чем проблема при перегрузке операторов &lt;&lt; &gt;&gt; прочитал много статей, сделал как в примере, но msvs 2013 выдает ошибку: ...


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

Или воспользуйтесь поиском по форуму:
Bino321
2 / 2 / 0
Регистрация: 22.11.2013
Сообщений: 33
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();" вставить в функцию или конструктор, чтобы каждый раз не писать в коде...
Yandex
Объявления
09.03.2014, 19:59     Перегрузка оператора <<
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru