说我有一个这样的课程:
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类的私有数据成员的值,而friend函数应该可以访问所有私有数据成员吗?
但我收到此错误:‘myIng’ was not declared in this scope
对于为什么会发生这种情况的任何想法?
答案 0 :(得分:6)
因为您需要明确表示您正在访问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评论:流操作符应返回其stream参数,以便您可以链接它们。
答案 1 :(得分:2)
在该范围内,没有任何名为myIng
的内容。错误很清楚。它的Ingredient& target
成员myIng
,所以你应该写:
target.myIng = MyString("hello");