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

Перегрузка << и >> - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
AltPeople
 Аватар для AltPeople
10 / 10 / 1
Регистрация: 25.09.2008
Сообщений: 73
23.06.2009, 18:08     Перегрузка << и >> #1
ачал изучать перегрузку ф-ций. Вот код:
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.h>
class PhoneNumber
{
friend ostream &operator<<(ostream &, const PhoneNumber &);
friend istream &operator<<(istream &, PhoneNumber &);
 
private:
        char areaCode[4];
        char exchange[4];
        char line[5];      
};
ostream &operator<<(ostream &output, const PhoneNumber &num)
{
        output<<"("<<num.areaCode<<")"<<num.exchange<<"-"<<num.line;
        return output;        
}
istream &operator>>(istream &input, PhoneNumber &num)
{
        input.ignore();
        input.getline(num.areaCode,4);
        input.ignore(2);
        input.getline(num.exchange,4);        
        input.ignore(2);
        input.getline(num.line,5);
        
        return input;
}
 
int main()
{
char ch='y';
    
    do{
       PhoneNumber phone;
       cout<<"Enter number in (123) 456-7890 format:\n";
       cin>>phone;
       cout<<"Number: "<<phone;        
        
              
        cout<<"\n\nContinue y/n? "<<endl;
        cin>>ch;
     }while (ch=='y');
 
     return 0;
}
Выдает следующие ошибки:
In function `std::istream& operator>>(std::istream&, PhoneNumber&)':
`char PhoneNumber::areaCode[4]' is private within this context
`char PhoneNumber::exchange[4]' is private within this context
`char PhoneNumber::line[5]' is private within this context


я понимаю, что есть проблема с обращением к закрытым членам, а вот как разрешить это не могу понять.
вроде &num дает право доступа к закрытым членам...
поиск не помог(((((
среда Dev C++
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2009, 18:08     Перегрузка << и >>
Посмотрите здесь:

C++ Перегрузка new
C++ перегрузка <<, >>, []
Перегрузка << C++
Перегрузка C++
C++ Перегрузка
Перегрузка C++
C++ перегрузка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Shved
9 / 9 / 1
Регистрация: 07.06.2009
Сообщений: 34
23.06.2009, 18:28     Перегрузка << и >> #2
Цитата Сообщение от AltPeople Посмотреть сообщение
#include <iostream.h>
class PhoneNumber
{
friend ostream &operator<<(ostream &, const PhoneNumber &);
friend istream &operator<<(может >>?)(istream &, PhoneNumber &);


}

Выдает следующие ошибки:
In function `std::istream& operator>>(std::istream&, PhoneNumber&)':
`char PhoneNumber::areaCode[4]' is private within this context
`char PhoneNumber::exchange[4]' is private within this context
`char PhoneNumber::line[5]' is private within this context


я понимаю, что есть проблема с обращением к закрытым членам, а вот как разрешить это не могу понять.
вроде &num дает право доступа к закрытым членам...
поиск не помог(((((
среда Dev C++
На счёт num не знаю, но дружественная функция позволяет обращаться к закрытым членам...
Vourhey
Почетный модератор
6470 / 2245 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
23.06.2009, 18:33     Перегрузка << и >> #3
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
class PhoneNumber
{
 
private:
        char areaCode[4];
        char exchange[4];
        char line[5];
        
friend ostream &operator<<(ostream &output, const PhoneNumber &num)
{
        output<<"("<<num.areaCode<<")"<<num.exchange<<"-"<<num.line;
        return output;        
}
friend istream &operator>>(istream &input, PhoneNumber &num)
{
        input.ignore();
        input.getline(num.areaCode,4);
        input.ignore(2);
        input.getline(num.exchange,4);        
        input.ignore(2);
        input.getline(num.line,5);
        
        return input;
}
};
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,314
23.06.2009, 18:35     Перегрузка << и >> #4
Просто исправь ошибку:
C++
1
friend istream &operator>>(istream &, PhoneNumber &);
AltPeople
 Аватар для AltPeople
10 / 10 / 1
Регистрация: 25.09.2008
Сообщений: 73
24.06.2009, 10:11  [ТС]     Перегрузка << и >> #5
мдаааа, ошибка тупая))))))))
and
 Аватар для and
20 / 20 / 1
Регистрация: 12.05.2009
Сообщений: 43
15.09.2009, 17:47     Перегрузка << и >> #6
У меня при перегрузки функции <<
возникает ошибка

Ошибка 1 error LNK2001: неразрешенный внешний символ ""class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class TNumeral const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABVTNumeral@@@Z)" N1.obj

как с этим бороться?
AltPeople
 Аватар для AltPeople
10 / 10 / 1
Регистрация: 25.09.2008
Сообщений: 73
15.09.2009, 17:59  [ТС]     Перегрузка << и >> #7
код в студию
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.09.2009, 18:05     Перегрузка << и >> #8
Цитата Сообщение от and Посмотреть сообщение
как с этим бороться?
1) чтением книг
2) определением тела функции
and
 Аватар для and
20 / 20 / 1
Регистрация: 12.05.2009
Сообщений: 43
15.09.2009, 18:09     Перегрузка << и >> #9
TNumeral.h //класс простой дроби по умолчанию 1/2

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#pragma once
#include <iostream>
using namespace std;
 
class TNumeral
{
    
public:
    int a,b;
    
    TNumeral(int i=1,int j=2):a(i),b(j){}
    ~TNumeral(void);
    TNumeral operator=(TNumeral sn); //простые  ф-к
    TNumeral operator+(TNumeral sn); // все норм работают
    TNumeral operator*(TNumeral sn); // посути не важны
    friend ostream &operator<<(ostream &, const TNumeral &);
    
};


TNumeral.cpp

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
#include "TNumeral.h"
TNumeral::~TNumeral(void)
{
    //cout<<"\n~dlt~\tTNumeral\n";
}
TNumeral TNumeral::operator +(TNumeral sn)
{
    TNumeral temp;
    temp.a=a+sn.a;
    temp.b=b+sn.b;
    return temp;
}
TNumeral TNumeral::operator =(TNumeral sn)
{
    a=sn.a;
    b=sn.b;
    return *this;
}
TNumeral TNumeral::operator *(TNumeral sn)
{
    TNumeral temp;
    temp.a=a*sn.a;
    temp.b=b*sn.b;
    return temp;
}
ostream &operator<<(ostream &output,TNumeral &SM)
{
    output<<SM.a<<'/'<<SM.b;
    return output;
}
Main.cpp !!!!
C++
1
2
3
4
5
6
7
8
9
#include "TNumeral.h"
 
 
int main()
{
    TNumeral sn;
    cout<<sn;
    return 0;
}
задание у мня такое:
создать класс представления дроби
1)конструктор с аргументами по умолчанию
2)конструктор копирования
3) перегрузка * + =
4) перегрузка << >> для ввода вывода
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1345 / 878 / 51
Регистрация: 02.01.2009
Сообщений: 2,642
Записей в блоге: 1
15.09.2009, 19:06     Перегрузка << и >> #10
TNumeral.h
C++
1
friend ostream &operator<<(ostream &, const TNumeral &);
и TNumeral.cpp
C++
1
2
ostream &operator<<(ostream &output,TNumeral &SM)
{
Разницу видишь?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2009, 19:59     Перегрузка << и >>
Еще ссылки по теме:

C++ Перегрузка.
перегрузка в с++ C++
C++ Перегрузка +
Перегрузка () C++
Перегрузка + C++

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

Или воспользуйтесь поиском по форуму:
and
 Аватар для and
20 / 20 / 1
Регистрация: 12.05.2009
Сообщений: 43
15.09.2009, 19:59     Перегрузка << и >> #11
Это не решает проблему

Добавлено через 2 минуты
Это не решает проблемы

Добавлено через 23 минуты
Сработала) Я описал функции внутри класса спс ISergey
Yandex
Объявления
15.09.2009, 19:59     Перегрузка << и >>
Ответ Создать тему
Опции темы

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