Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
5 / 5 / 0
Регистрация: 22.05.2012
Сообщений: 122
1

Как переопределить дружественную функцию ввода для класса наследника

18.05.2014, 01:43. Показов 1517. Ответов 5
Метки нет (Все метки)

Есть класс предок, который имеет такую вот дружественную функцию ввода:
C++
1
2
3
4
5
6
7
    
friend ifstream & operator >>(ifstream & inf, Tovar & obj)
    //Дружественная перегрузка оператора ввода
{
    inf >> obj.nameT >> obj.countryT >> obj.amountT;
    return inf;
}
и есть класс наследник с 2мя дополнительными полями double priceT и bool perishableT
И есть файл в котором содержимое выглядит вот так:
Код
nameT   countryT   amountT   priceT   perishableT
//Все данные в 1 строке записаны.
Добавлено через 1 час 24 минуты
Можно сразу и с оператором вывода
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.05.2014, 01:43
Ответы с готовыми решениями:

Реализовать и протестировать функцию перегрузки операции потокового вывода как дружественную функцию для класса Matrix
Добавить в определение класса Matrix, реализовать и протестировать функцию перегрузки операции...

Как определить дружественную функцию шаблонного класса?
Подскажите, пожалуйста, как определить дружественную функцию какого-то определенного шаблона? ...

Как сделать открытым свойство для наследника но закрытым для наследника наследника?
Есть класс GameObject в котором есть свойство Coordinates Класс Animal наследуется от GameObject и...

Передача параметров в дружественную функцию класса
Всем доброго времени суток. Читал про дружественные функции, в учебнике по которому учусь написано,...

5
Форумчанин
Эксперт CЭксперт С++
8170 / 5020 / 1436
Регистрация: 29.11.2010
Сообщений: 13,453
18.05.2014, 01:50 2
Переопределяется также как и все обычные функции
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
class A
{
public:
    friend std::istream& operator>>(std::istream &i, A &) {std::cout << "A\n"; return i; }
};
 
class B
{
public:
    friend std::istream& operator>>(std::istream &i, B &) {std::cout << "B\n"; return i; }
};
 
int main()
{
    A a;
    B b;
    std::cin >> a >> b;
}
0
5480 / 4875 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.05.2014, 02:15 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
26
27
28
29
class Price;
 
class Tovar
{
    char nameT[30];
    char countryT[30];
    int amountT;
 
public:
    friend ifstream & operator >>(ifstream & inf, Tovar & obj)
    {
        inf >> obj.nameT >> obj.countryT >> obj.amountT;
        return inf;
    }
    friend ifstream & operator >>(ifstream & inf, Price & obj);
};
 
class Price : public Tovar
{
    double priceT;
    bool perishableT;
 
public:
    friend ifstream & operator >>(ifstream & inf, Price & obj)
    {
        inf >> obj.nameT >> obj.countryT >> obj.amountT >> obj.priceT >> obj.perishableT;
        return inf;
    }
};
0
5 / 5 / 0
Регистрация: 22.05.2012
Сообщений: 122
18.05.2014, 02:16  [ТС] 4
Мне нужно что бы считывалось все построчно из файла.
Код
6 //количество
nameT1   countryT1   amountT1   priceT1   perishableT1
nameT2   countryT2   amountT2   priceT2   perishableT2
nameT3   countryT3   amountT3   priceT3   perishableT3
nameT4   countryT4   amountT4   priceT4   perishableT4
nameT5   countryT5   amountT5   priceT5   perishableT5
nameT6   countryT6   amountT6   priceT6   perishableT6
Это у меня делает друж. функция из 3-го класса, она вызывает друж функцию класса 2, который являеться наследником класса 1.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Класс 1
class class1
{
protected:
string nameT;
string countryT;
int amountT;
public:
.....
friend ifstream & operator >>(ifstream & inf, class1 & obj)
    //Дружественная перегрузка оператора ввода
{
    inf >> obj.nameT >> obj.countryT >> obj.amountT;
    return inf;
}
.....
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Класс 2
class class2:public class1
{
private:
 double priceT;
 bool perishableT;
public:
 ......
 
 friend ifstream & operator >>(ifstream & inf, class2 & obj)
 {
       ???????????????
 }
......
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//Класс 3
class class3
{
private:
 class2  * Aobj; 
 int amountA; //количество типов 
public:
 ......
 friend ifstream & operator >>(ifstream & inf, class3 & obj)
 {
    inf>>obj.amountA;
    obj.allT = new Tovar[obj.amountA];
    for (int i = 0; i < obj.amountA; i++)
    {
        inf >> obj.Aobj[i];
    }
    return inf;
 
 }
0
Форумчанин
Эксперт CЭксперт С++
8170 / 5020 / 1436
Регистрация: 29.11.2010
Сообщений: 13,453
18.05.2014, 02:52 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
//Класс 1
class class1
{
protected:
string nameT;
string countryT;
int amountT;
public:
friend ifstream & operator >>(ifstream & inf, class1 & obj)
    //Дружественная перегрузка оператора ввода
{
    inf >> obj.nameT >> obj.countryT >> obj.amountT;
    return inf;
}
};
 
//Класс 2
class class2:public class1
{
private:
 double priceT;
 bool perishableT;
public:
 
 friend ifstream & operator >>(ifstream & inf, class2 & obj)
 {
        inf >> obj.nameT >> obj.countryT >> obj.amountT >> obj.priceT >> obj.perishableT;
        return inf;
 }
};
 
class class3
{
//private:
public:
 class2  * Aobj;
 int amountA; //количество типов
public:
 friend ifstream & operator >>(ifstream & inf, class3 & obj)
 {
    inf>>obj.amountA;
    obj.Aobj = new class2[obj.amountA];
    for (int i = 0; i < obj.amountA; i++)
    {
        inf >> obj.Aobj[i];
    }
    return inf;
 
 }
};
0
║XLR8║
1210 / 907 / 270
Регистрация: 25.07.2009
Сообщений: 4,354
Записей в блоге: 5
18.05.2014, 02:55 6
влад0,
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>
#include <sstream>
#include <string>
#include <vector>
#include <iterator>
 
struct A {
    std::string nameT,
        countryT,
        amountT;
    friend std::istream &operator>> (std::istream &in, A& a) {
        return in >> a.nameT >> a.countryT >> a.amountT;
    }
};
 
struct B : A {
    std::string priceT,
        perishableT;
    friend std::istream &operator>> (std::istream &in, B& b) {
        return in >> static_cast<A&>(b) >> b.priceT >> b.perishableT;
    }
};
 
int main (int argc, char const* argv[]) {
    std::istringstream input{
        std::string{"11 12 13 14 15 16 "} +
        std::string{"21 22 23 24 25 26 "} +
        std::string{"31 32 33 34 35 36 "} +
        std::string{"41 42 43 44 45 46 "}};
    typedef std::istream_iterator<B> in;
    std::vector<B> v{in{input}, in{}};
    for (B b: v) std::cout << b.nameT << " " << b.perishableT << '\n';
}
Bash
1
2
3
4
5
6
ruslan@TFTM-K53TA:~/Programming/c++/cyberforum$ make && ./main 
clang++ main.cpp -o main -std=c++11
11 15
16 24
25 33
34 42
Идея понятна?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.05.2014, 02:55

Как организовать дружественную функцию для печати массива
\\void ww_mas(); надо сделать как дружественную функцию #pragma once class massiv { float...

Натолкните на мысль, где вычитать и т.д. Есть два класса, нужно сделать дружественную функцию
Вот есть допустим классы Матрица, Вектор, готовые, нужно что бы была функция типа Matrix M() =...

Как лучше переопределить GetHashCode() для моего класса
Здравствуйте, уважаемые форумчане, возник вопрос к знающим людям. Имеется простой класс, с парой...

Создание экземпляра класса-наследника для переменной с типом базового класса
Подскажите чайнику как создается экземпляр класса BC BaseClass BC = new DerivedClass(); ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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