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

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

Восстановить пароль Регистрация
 
влад0
4 / 4 / 0
Регистрация: 22.05.2012
Сообщений: 115
18.05.2014, 01:43     Как переопределить дружественную функцию ввода для класса наследника #1
Есть класс предок, который имеет такую вот дружественную функцию ввода:
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 минуты
Можно сразу и с оператором вывода
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2014, 01:43     Как переопределить дружественную функцию ввода для класса наследника
Посмотрите здесь:

Как организовать дружественную функцию для печати массива C++
Как переопределить конструктор класса C++
C++ Создание экземпляра для наследника абстрактного класса
Перегрузка операций (Создать класс вещественных чисел (double); определить оператор +, как функцию-элемент и – как дружественную функцию) C++
C++ Можно ли объявить дружественную функцию как шаблон?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
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;
}
alsav22
5282 / 4801 / 442
Регистрация: 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
4 / 4 / 0
Регистрация: 22.05.2012
Сообщений: 115
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;
 
 }
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
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;
 
 }
};
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
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
Идея понятна?
Yandex
Объявления
18.05.2014, 02:55     Как переопределить дружественную функцию ввода для класса наследника
Ответ Создать тему
Опции темы

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