我不太懂英語,抱歉。當我讀到c 入門書的時候,我遇到了這樣的代碼。
class Message {
friend class Folder;
public:
...
private:
std::string contents;
std::set<Folder*> folders;
...
};
...
void swap(Message& lhs, Message& rhs) {
使用 std::swap。
for (auto f : lhs.folders) { f->remMsg(& lhs); }
//class Folder is undefined by book[/span]。
...
}
...
我省略了一些我認為不相關的函式。此外,C 入門書要求我自己實作class Folder。所以我添加了更多的代碼。
class Folder; // my code
class Message {
friend void swap(Message& , Message&); // my code
friend class Folder。
public:
...
private:
std::string contents;
std::set<Folder*> folders;
...
};
void swap(Message&, Message&); //my code
// I added the whole class.
class Folder {
friend void swap(Folder& , Folder&)。
friend class Message。
public:
...
private:
...
void addMsg(Message* m) { msgs.insert(m); }
void remMsg(Message* m) { msgs.erase(m); }; }; msgs.insert(m)
};
void swap(Folder&, Folder&); // my code
在file.cpp中
void swap(Message& lhs, Message& rhs){
使用 std::swap。
for (auto f : lhs.folders) { f->remMsg(& lhs); }
// In vs2019
//Error (active) E0265 function "Folder::remMsg" is inaccessible。
...
}
正如你所看到的,我無法使用函式Folder::remMsg。
然后,我試圖弄清楚朋友函式是如何作業的。我寫了這些代碼。
struct B; // This is [line 1]/span>
結構 A {
friend void swap(A& , A&)。
private。
int n;
std::vector<B*> Bs;
};
void swap(A& lhs, A& rhs) {
for (auto f : lhs.Bs) { f-> n; }
//f->n仍然是不可訪問的。
//如果我洗掉第1行,代碼可以被成功編譯。
//與Folder類相同。
...
}
struct B {
friend struct A。
private:
int n;
A C。
};
我不明白為什么會發生這種情況。
順便說一下,我之所以將class Message和class Folder的朋友類相互宣告,是因為我想用對稱的swap來使用復制交換。
uj5u.com熱心網友回復:
void swap(Message& lhs, Message& rhs)是Message的朋友,但你試圖訪問Folder的私有成員。你的最后一段代碼也有同樣的問題。friend void swap(A&, A&);是A的好友,但是你試圖訪問B的私有成員。friend不是傳遞性的。僅僅因為A是B的朋友,并且swap是A的朋友并不意味著swap是B的朋友。
如果你想讓void swap(A&,A&)授予訪問B的私有成員,那么讓它成為B的朋友:
#include <vector>
結構 B。
結構 A {
friend void swap(A& , A&);
private。
int n;
std::vector<B*> Bs;
};
struct B {
friend void swap(A&,A&)。
private。
int n;
A C。
};
void swap(A& lhs, A& rhs) {
for (auto f : lhs.Bs) { f-> n; }
//^^訪問A的私有成員。
//^^訪問B的私有成員。
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/333769.html
標籤:
