3

私がそのようなクラスを持っているとしましょう:

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");
}

私の考えでは、これは、Friend関数のIngredientクラスのプライベートデータメンバーの値を設定していて、Friend関数がすべてのプライベートデータメンバーにアクセスできる必要があるため、機能するはずです。

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

4

2 に答える 2

7

targetローカル変数やグローバル変数ではなく、パラメーターのメンバーにアクセスしていることを明示する必要があるため、次のようになります。

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

あなたが言及したように、演算子がのfriendであるため、上記は正確に機能します。Ingredient友情を削除してみると、privateメンバーにアクセスできなくなることがわかります。

また、Joeがコメントしているように、ストリームオペレーターは、チェーンパラメーターを返すことができるようにストリームパラメーターを返す必要があります。

于 2011-10-27T20:00:47.607 に答える
2

その範囲では、と呼ばれるものはありませんmyIng。エラーはそれでかなり明白です。メンバーIngredient& targetがいるmyIngので、次のように書く必要があります。

target.myIng = MyString("hello");
于 2011-10-27T20:03:51.697 に答える