2011-04-05 116 views
0

在李普曼P656我讀:非模板函數朋友

非模板函數或類的朋友可以到類模板:

template<class Type> class Bar { 
    friend class Foobar; 
    friend void fcn(); 
}; 

我不知道這一切的手段。如果fcn成爲朋友,那麼是因爲您希望它訪問Bar的私人成員,但如果沒有任何Bar對象作爲參數傳入,它如何訪問它們?

有人請賜教我嗎?

回答

5

作爲friendX意味着朋友(無論是功能還是班級)都可以訪問X的所有私人和受保護成員。

在您的示例中,類Foobar和函數fcn可以訪問Bar類的私有和受保護成員。

現在的問題是:

怎麼能訪問它們,如果還沒有得到傳遞到作爲參數的酒吧對象?

那麼,它可以訪問,如果它有Bar的實例。例如。

void fcn() 
{ 
    Bar<int> bar; 
    bar.PrivateFun(); //okay even if PrivateFun is a private function of Bar 
    bar.PrivateData = 10; //okay even if PrivateData is a private data of Bar 
} 

只是爲了強調差異,認爲這另一個功能:

void g() 
{ 
    Bar<int> bar; 
    bar.PrivateFun(); //compilation error - g() is not a friend of Bar! 
    bar.PrivateData = 10; //compilation error - g() is not a friend of Bar! 
} 

希望它可以幫助你理解這意味着什麼能夠訪問類的私有成員,這意味着什麼是一個friend一類!

+0

true - 這是一個錯字。 – RandomCPlusPlus 2011-04-05 17:13:46

+0

因爲我相信你弄清楚了,在我之前的問題中,我的一個錯誤來自於我不清楚上述來自Lippman的陳述 – RandomCPlusPlus 2011-04-05 17:15:14

+0

是的 - 它是有道理的。再次感謝。 – RandomCPlusPlus 2011-04-05 17:20:59

0

也許有一個全球性的Bar<T>它可以訪問 - 只是因爲沒有明顯的參數並不意味着它不能訪問Bar<T>。而且,這是不合格的語法。

+0

語法錯誤在哪裏?另外,您是否收到了關於§D.5的消息? – Potatoswatter 2011-04-05 17:27:45