2011-10-27 16 views
2

は、私はそうのようなクラスがあるとしましょう:このオーバーロードされたフレンド関数でC++エラー:(プライベートデータメンバー)がこのスコープで宣言されていなかった

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

、私はmyIng

の値を設定しようとしています

友人の機能でIngredientクラスのプライベートデータメンバーの値を設定していて、友人の関数がすべてのプライベートデータメンバーにアクセスできる必要があるので、これはうまくいくはずですか?

しかし、私はこのエラーを受け取ります:‘myIng’ was not declared in this scope これはなぜ起こっているのですか?

答えて

6

あなたはtargetパラメータのメンバーではなく、ローカルまたはグローバル変数にアクセスしていることを明示的に指定する必要がありますので:オペレータがようIngredientfriendあるので

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

上記は正確に動作しますあなたは言及します。友情を削除しようとすると、privateにアクセスすることはできなくなります。

また、Joeのコメントとして、ストリーム演算子はストリームパラメータを返して、チェーン化できるようにする必要があります。

+0

をと 'in'を返すことを忘れないでください:あなたが書く必要がありますので、myIng部材を有するそのIngredient& target。 – Joe

+0

@Jon:opps ...それをキャッチするために感謝! –

2

この範囲では、myIngと呼ばれるものはありません。このエラーはかなり明らかです。

target.myIng = MyString("hello"); 
関連する問題