這有雞雞蛋問題。 B
必須完全定義爲A
才能看到B::Itemfunction
。
class A
{
friend void B::Itemfunction(); <-- Itemfunction does not exist yet
private:
int number;
int size;
public:
int Randomfunction();
};
class B: public A
{
private:
std::string Random;
public:
void Itemfunction();
void CheckLog();
};
交換順序將無法工作或者是因爲B
需要A
被定義爲從A
繼承。
class B: public A <-- A does not exist yet
{
private:
std::string Random;
public:
void Itemfunction();
void CheckLog();
};
class A
{
friend void B::Itemfunction();
private:
int number;
int size;
public:
int Randomfunction();
};
方案1向前定義class B
所以編譯器知道b存在,即使對此一無所知,然後friend
全班同學,因爲A
只知道B
存在。 OP的friend
關係得以維持。
class B; <-- forward definition of B
class A
{
friend class B; <-- friending all of B, not just the function
private:
int number;
int size;
public:
int Randomfunction();
};
class B: public A
{
private:
std::string Random;
public:
void Itemfunction();
void CheckLog();
};
但是!全部B
現在可以完全訪問所有A
。如果A
想要保留size
或其他任何隱藏在其控制之下的成員,則很難。 B
可以調用A
的所有函數並更改所有A
的成員變量。 B
完全可以播放A
。
這也不會擴展到其他的子類。B
可以看到所有的A
,但是C
和D
不能。
所以說你有一個不太重要的例子,其中A
不允許任何人混淆size
的值。也許這是內部陣列的容量,並且更改size
將導致A
運行超過分配的內存末尾。原因在這裏並不重要;爲了本示例的目的,除A
外,沒有人可以更改size
。
這導致我們找到解決方案2:protected access和訪問器函數。
class A
{
protected: <-- all inheritors can access members in this block. No one else can
int number;
private: <-- only A can access members in this block
int size;
public:
int Randomfunction();
int getSize() <-- accessor function to provide read-only access to size
{
return size;
}
};
class B: public A
{
private:
std::string Random;
public:
void Itemfunction(); <-- can do anything to number and read size
void CheckLog(); <-- so can this
};
class C: public A
{
private:
std::string member;
public:
void doStuff(); <-- and this
void DoOtherStuff(); <-- and this
};
B
和C
可以訪問A::number
,並可以使用A::getSize
看到size
值。 number
可以更改B
和C
,但size
不能。如果您擔心調用函數的代價爲size
,請不要這樣做。當編譯器完成A::getSize
時,你甚至不會知道它在那裏。它可能不是。
謝謝你的迴應,我現在看到圈子的問題。我想除了你所描述的解決方案之外,讓B班成爲A的朋友也應該是正確的?或者作爲派生類和朋友會有問題嗎? –
想想你的程序的需求。如果'A'朋友'B'使得'B'可以訪問,那麼孩子'C'或'D'是什麼?當你添加子類時友誼不會擴展。 ['protected'access will](http://en.cppreference.com/w/cpp/language/access),如果這是你想要的。 – user4581301
@ afc_1995'protected'旨在解決這個確切的問題,所以你應該真的使用'protected'。如果'B'是'A'的朋友,它就可以訪問所有內容,包括私人成員。保護性和私密性的全部要點是,A可以決定其子女有權訪問的內容。你有什麼理由選擇友誼來保護自己? –