Ошибка C ++: (закрытый элемент данных) не был объявлен в этой области - PullRequest
2 голосов
/ 27 октября 2011

Скажем, у меня есть такой класс:

class Ingredient
{
    public:
        friend istream& operator>>(istream& in, Ingredient& target);
        friend ostream& operator<<(ostream& out, Ingredient& data);
    private:
        Measure myMeas;
        MyString myIng;
};

В этой перегруженной функции друга я пытаюсь установить значение myIng

istream& operator>>(istream& in, Ingredient& target)
{
    myIng = MyString("hello");
}

По-моему, это должно сработать, потому что я устанавливаю значение закрытого члена данных класса Ingredient в функции друга, а функция друга должна иметь доступ ко всем частным данным, верно?

Но я получаю эту ошибку: ‘myIng’ was not declared in this scope Есть идеи, почему это происходит?

Ответы [ 2 ]

6 голосов
/ 28 октября 2011

Поскольку вам необходимо четко указать, что вы обращаетесь к члену параметра target, а не к локальной или глобальной переменной:

istream& operator>>(istream& in, Ingredient& target)
{
    target.myIng = MyString("hello"); // accessing a member of target!
    return in; // to allow chaining
}

Выше будет работать именно потому, что оператор friend из Ingredient, как вы упоминаете.Попробуйте удалить дружбу, и вы увидите, что доступ к private членам больше не будет возможен.

Кроме того, как замечает Джо: операторы потока должны возвращать свои параметры потока, чтобы вы могли их связать.

2 голосов
/ 28 октября 2011

В этой области ничего не называется myIng.Ошибка довольно ясна на этом.Ingredient& target имеет члена myIng, поэтому вы должны написать:

target.myIng = MyString("hello");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...