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

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

18.05.2014, 01:43. Просмотров 600. Ответов 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
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2014, 01:43
Ответы с готовыми решениями:

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

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

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

Перегрузка операций (Создать класс вещественных чисел (double); определить оператор +, как функцию-элемент и – как дружественную функцию)
помогите решить пожалуйста Задание 2. Бинарная операция Создать класс вещественных чисел...

Сделать дружественную функцию для критерия Кохрена
Не знаю как сделать дружественную функцию для критерия кохрена, все остальное работает ...

5
MrGluck
Форумчанин
Эксперт CЭксперт С++
8135 / 4986 / 1436
Регистрация: 29.11.2010
Сообщений: 13,459
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
alsav22
5461 / 4856 / 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
влад0
4 / 4 / 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
MrGluck
Форумчанин
Эксперт CЭксперт С++
8135 / 4986 / 1436
Регистрация: 29.11.2010
Сообщений: 13,459
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
outoftime
║XLR8║
893 / 774 / 237
Регистрация: 25.07.2009
Сообщений: 3,856
Записей в блоге: 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
18.05.2014, 02:55
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2014, 02:55

Как добавить дружественную функцию в класс
Написал код, а как добавить функцию friend? #include &lt;iostream&gt; #include &lt;conio.h&gt; #include...

Определить унарный оператор ++ как дружественную функцию
Есть программа: #include &quot;stdafx.h&quot; #include&lt;iostream&gt; #include&lt;conio.h&gt; using namespace std;...

Можно ли объявить дружественную функцию как шаблон?
Так всё работает: template&lt;class T&gt; class random { /*всячина*/ public: friend void...


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

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

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