2012-11-22 118 views
1

ostream & operator<<(ostream &os, A &A0)函数正在生成警告。朋友分类中的退货声明

下面是类的定义方式:

class A 
{ 
    public: 
     friend ostream & operator<<(ostream &os, A &A0); 
     A& operator=(string strSlot_); 
     A& operator+(string strSlot_); 
     A& operator+(const A &B); 
     A& operator=(const A &B); 
     string slotReturn(); 
     A(string strSlot_); 
     A(const A &object); 
     void slotChange(); 
     void sCout(); 
     ~A(); 
     A(); 
    private: 
     string strSlot; 
     int n; 
}; 


ostream & operator<<(ostream &os, A &A0) 
{ 
    os << "strSlot = \"" << A0.slotReturn() << "\"" << endl; 
} 

string A::slotReturn() 
{ 
    return strSlot; 
} 

的问题是,什么是它应该返回? *this似乎不起作用(因为它是friend?)。 (这只是一个警告,但我仍然想知道)

此外,为什么我不能通过A &A0作为常量(在这种情况下,错误是:“将'const''作为'this'传递' 'std :: string A :: slotReturn()'抛弃限定符“)的参数?

+1

因为你需要使'slotReturn()'ac按照我的回答建议的方法。 – juanchopanza

回答

5

您需要返回std::ostream&本身:

ostream & operator<<(ostream &os, A &A0) 
{ 
    return os << "strSlot = \"" << A0.slotReturn() << "\"" << endl; 
} 

顺便说一句,该术语是稍微偏离。没有“朋友班”。 std::ostream& operator<<是这里的朋友。但它甚至不需要成为朋友,因为它只是调用A的公共成员函数。所以你可以删除朋友声明。

你或许应该也使slotReturn()一个const方法:

string slotReturn() const; 
     //   ^const method 

和修改ostream& operator<<采取一个const参考:

ostream & operator<<(ostream& os, const A& A0) { .... } 

这将允许您打印出临时工:

std::cout << A("I am a temporary!") << "\n"; 
+0

+1对于术语的额外评论和'不需要成为朋友'。 –

+0

@ErgoProxy是的,你会的。朋友的意思是“让这个功能/操作员访问我的私人或受保护的领域”,这是你的操作员不这么做的。所以错误必须是无关的。 – juanchopanza

+0

@juanchopanza,啊谢谢。 我会继续并清理代码;我们刚刚在大学开始使用C++,这就是为什么我的术语用法是关闭的。 谢谢你向我澄清。 :) –