Joh*_*ski 1 c++ nested class declaration forward
假设我有两个类定义如下:
class obj1
{
private:
int mem;
void method1();
friend class obj2;
};
class obj2
{
public:
void method2();
};
void obj2::method2()
{
obj1 test;
test.mem = 59999;
std::cout << test.mem;
return;
}
Run Code Online (Sandbox Code Playgroud)
这非常有效.在main中,如果我声明一个obj2类型的对象然后调用它的method2成员函数,它可以成功地从obj1的实例访问私有变量.现在,假设我将这些类嵌套:
class parent
{
public:
class obj1
{
private:
int mem;
void method1();
friend class obj2;
};
class obj2
{
public:
void method2();
};
void my_function();
};
void parent::obj2::method2()
{
obj1 test;
test.mem = 59999;
std::cout << test.mem;
return;
}
void parent::my_function()
{
obj2 test2;
obj2.method2();
return;
}
Run Code Online (Sandbox Code Playgroud)
这不会编译.它说"mem"是私有的,即使obj2被宣布为朋友类.我可以解决这个问题的唯一方法是将类obj2的前向声明放在obj1类的定义之前.但是如果类没有嵌套,我不必这样做. 为什么是这样?
声明的类friend
在friend
声明的上下文中查找.如果找到一个,这个类就成了一个friend
.如果没有找到,则在最近的命名空间级别声明该类,并将该类设为a friend
.该friend
声明不会引入一个嵌套类的名称.但是它会创建一个嵌套的类a friend
.