2011-11-04 38 views
0

我遇到了好友功能問題。無法初始化好友功能運算符<<

我認爲這是所需代碼的唯一部分..我的問題是與此功能。它說問題出在第一行,但我不知道這是多麼準確。

friend ostream & operator << (ostream & b, Book & a) 
    { 
    b.setf(ios::fixed | ios::showpoint); 
    b.precision(2); 
    b << "Title  : \"" << a.title << "\"\n" 
    << "Author  : \"" << a.author << "\"\n" 
    << "Price  : $" << a.price/100.0 << endl 
    << "Genre  : " <<a.genre << endl 
    << "In stock? " << (a.status ? "yes" : "no") << endl 
    << endl; 
    return b; 
    } 

我得到的錯誤: lab10.cpp:95:錯誤:無法初始化友元函數âoperator< <â

lab10.cpp:95:錯誤:友元聲明不上課定義

在此先感謝

回答

1

您必須指定功能是哪個類的朋友。你要麼把該函數的類聲明:

class Book{ 
... 
    friend ostream & operator << (ostream & b, Book & a) 
    { 
    b.setf(ios::fixed | ios::showpoint); 
    b.precision(2); 
    b << "Title  : \"" << a.title << "\"\n" 
    << "Author  : \"" << a.author << "\"\n" 
    << "Price  : $" << a.price/100.0 << endl 
    << "Genre  : " <<a.genre << endl 
    << "In stock? " << (a.status ? "yes" : "no") << endl 
    << endl; 
    return b; 
    } 
}; 

另一種方式是將其聲明爲類中的朋友,而在其他一些地方把它定義:

class Book{ 
... 
    friend ostream & operator << (ostream & b, Book & a); 
}; 

...

// Notice, there is no "friend" in definition! 
ostream & operator << (ostream & b, Book & a) 
    { 
    b.setf(ios::fixed | ios::showpoint); 
    b.precision(2); 
    b << "Title  : \"" << a.title << "\"\n" 
    << "Author  : \"" << a.author << "\"\n" 
    << "Price  : $" << a.price/100.0 << endl 
    << "Genre  : " <<a.genre << endl 
    << "In stock? " << (a.status ? "yes" : "no") << endl 
    << endl; 
    return b; 
} 
+0

這解決了我的問題。非常感謝您的投入。朋友的功能仍然讓我感到困惑。 – user1028985

+0

請注意,只有通過ADL才能看到類體內定義的朋友函數。儘管如此,運營商無論如何都有望被使用。 –

1

您是否有在課堂內原型的朋友函數?你需要在課堂內有東西表明這是一個朋友功能。像線

friend ostream& operator<<(...); 

什麼的。查找一個完整的示例來重載插入/提取操作符以獲取更多信息。

+0

我確實有過它的原型,但感謝您的回覆。我忘了把它放在那裏。 – user1028985

0
#include <iostream> 
#include <string> 
using namespace std; 

class Samp 
{ 
public: 
    int ID; 
    string strName; 
    friend std::ostream& operator<<(std::ostream &os, const Samp& obj); 
}; 
std::ostream& operator<<(std::ostream &os, const Samp& obj) 
    { 
     os << obj.ID<< 「 」 << obj.strName; 
     return os; 
    } 

int main() 
{ 
    Samp obj, obj1; 
    obj.ID = 100; 
    obj.strName = "Hello"; 
    obj1=obj; 
    cout << obj <<endl<< obj1; 

} 

OUTPUT: 100你好 100 [小] ELLO 按任意鍵繼續......

這可能是一個朋友的功能,只是因爲對象是< <運營商和論證COUT的右邊是在LHS。所以這個不能成爲類的成員函數,它只能是一個朋友函數。