C ++ памылка: (закрыты член дадзеных) не быў абвешчаны ў гэтай галіне

Скажам, у мяне ёсць клас, так як:

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

In this overloaded friend function, I'm trying to set the value of myIng

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

На мой погляд, гэта павінна працаваць, таму што я ўсталёўваю значэнне прыватнага элемента дадзеных класа кампанента ў функцыі аднаму і функцыі аднаму павінны мець доступ да ўсіх закрытым членам дадзеных дакладна?

Але я атрымліваю гэтую памылку: «myIng» не быў абвешчаны ў гэтай галіне Любая ідэя аб тым, чаму гэта адбываецца?

2

2 адказы

Таму што вы павінны быць выразна паказана, што вы звяртаецеся да сябра мэтавай параметр, а не лакальнай або глабальнай зменнай:

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

Вышэй будзе працаваць менавіта таму, што аператар з'яўляецца сябар з Інгрэдыент , як вы кажаце. Паспрабуйце выдаліць дружбу, і вы ўбачыце, што доступ да прыватныя Члены больш не будзе магчымым.

Акрамя таго, як каментары Джо: аператары патоку павінны вяртаць іх параметры патоку, так што вы можаце прыкаваць іх.

6
дададзена
І не забудзьцеся вярнуцца у .
дададзена аўтар Joe, крыніца
@ Джон: OPPS ... дзякуй за ловячы што!
дададзена аўтар user637965, крыніца

In that scope, there is nothing called myIng. The error is pretty clear on that. Its Ingredient& target who has a myIng member, so you should write:

target.myIng = MyString("hello");
2
дададзена