2

Lippman 的Essential C++第 4.7 节做到了这一点。但我不知道为什么这段代码无法编译:

#include <iostream>
using namespace std;

class A
{   
void f();
//other members...
};

class B
{
//other members...
friend void A::f();
};

int main()
{
return 0;
}

在 A 类编译的 void f() 之前放置一个“public:”。所以李普曼错了?

ps 李普曼的代码是这样的:

//...
class Triangular_iterator
{
//...
private:
void check_integrity() const;
//...
};

//...

class Triangular
{
//...
friend void Triangular_iterator::check_integrity();
//...
};

//...
4

2 回答 2

5

您不能将“A 类”的函数或成员声明为“B 类”中“B 类”的朋友。
您必须让“B 类”成为“A 类”的朋友,然后成为A::f()“B 类”的朋友:

class A
{   
void f();

friend class B; //allow B access to private (protected) members and functions
};

class B
{
friend void A::f();
};

在现实生活中,你也不能违背某人的意愿决定成为他们的朋友!

有关示例,请参见此处。

于 2013-08-07T11:46:18.910 回答
4

类 A 的私有成员函数可以声明为类 B 的友元。为此,必须将类 B 声明为类 A 的友元(否则,类 B 看不到类 A 的私有成员函数):

class A
{
    friend class B;
    void f();
};

class B
{
    friend void A::f();
};

在 C++ 中,朋友的概念来自这样一个事实,即我允许我声明为朋友的人以不同于非朋友的方式对待我。它不涉及将我声明为朋友的人与非朋友区别对待。

于 2013-08-07T11:56:39.757 回答