c ++ hatası: (özel veri üyesi) bu kapsamda bildirilmedi

Benim gibi bir dersim olduğunu söyle:

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

Aklımda bu işe yarar çünkü bir arkadaş fonksiyonunda sınıftaki özel bir Bileşen üyesinin değerini ayarlıyorum ve arkadaş fonksiyonu tüm özel veriye erişim hakkına sahip olmalı mı?

Ancak bu hatayı alıyorum: ‘myIng’ bu kapsamda bildirilmedi Bunun neden olduğuna dair bir fikrin var mı?

2

2 cevap

Yerel veya genel bir değişken değil, target parametresinin bir üyesine eriştiğinizin açık olması gerektiğinden dolayı:

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

Yukarıdaki, tam olarak çalışır çünkü operatör, bahsettiğiniz gibi Ingredient kodunun arkadaşıdır . Arkadaşlığı kaldırmayı deneyin ve private üyelerine erişmenin artık mümkün olmayacağını göreceksiniz.

Ayrıca, Joe'nun söylediği gibi: akış operatörleri akış parametrelerini döndürmeli, böylece onları zincirleyebilirsiniz.

6
katma
'da ' ı iade etmeyi unutmayın.
katma yazar Joe, kaynak
@Jon: opps ... bunu yakaladığın için teşekkürler!
katma yazar user637965, kaynak

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
katma