Перегрузка << Не удается получить доступ к унаследованным частным данным - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь перегрузить operator<< из класса second. Проблема в том, что некоторые данные, к которым я пытаюсь получить доступ, являются частными в классе first. Почему я не могу получить доступ к частным данным, так как использую функцию друга?

Я обнаружил, что перегрузка работает только с не унаследованными частными данными.

class first
{
public:

    student(string a, string b, float c, int d);

private:
    string a;
    string b;
    float c;
    int d;
    int e;
    static int count;   
};


class second : public first
{
public:

    second(string a, string b, float c, int d, string f);


    friend ostream &operator << (ostream &output, second &dS);
    friend istream &operator >> (istream &input, second &dS);

private:
    string f; 
};


// Separate File

ostream &operator <<(ostream& output, second& dS){

    output << iS.a << endl;

    output << iS.f << endl;


return output;
}

Это ошибка, которую я получаю:

overload.cpp:27:18: error: 'a' is a private member of 'first'
    output << dS.a << endl;
                 ^
./example.hpp:51:9: note: declared private here
        string a; 

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Когда вы пишете

friend ostream &operator << (ostream &output, second &dS);

, вы разрешаете некоторой внешней функции с этой подписью иметь доступ к любому внутреннему атрибуту / члену, к которому имеет доступ ваш класс second. Это означает, что operator<< будет иметь доступ к атрибуту f, даже если он является личным. Однако ваш класс second не имеет доступа к частным данным из базового класса. Таким образом, он не может предоставить этот доступ к функции friend.

0 голосов
/ 10 октября 2019

Как говорили другие, второй класс не имеет доступа к закрытым членам первого класса. Вы можете попробовать написать несколько наборов и получить методы в первом классе. Методы get вернут значение (которое, я полагаю, вы ищете). Вы можете вызвать эту функцию во втором классе. Не уверен, если это идет за борт для того, что вы ищете, хотя. Может просто захотеть сделать перегрузку в первом классе

...