2012-11-22 103 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++,這就是爲什麼我的術語用法是關閉的。 謝謝你向我澄清。 :) –