嵌套朋友需要转发声明 类
Forward Declaration necessary for nested friend classes
假设我有两个 class 定义如下:
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;
}
效果很好。总的来说,如果我声明一个obj2类型的对象,然后调用它的method2成员函数,它就可以成功地从obj1的一个实例中访问私有变量。现在,假设我将这些 classes 嵌套:
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;
}
这将无法编译。它说 "mem" 是私有的,即使 obj2 被声明为朋友 class。解决此问题的唯一方法是将 class obj2 的前向声明放在 obj1 的 Class 定义之前。然而,如果 classes 没有嵌套,我就不必这样做。 这是为什么?
声明为 friend
的 class 在 friend
声明的上下文中查找。如果找到一个,这个 class 就变成 friend
。如果找到 none,则在最近的命名空间级别声明 class,并将此 class 设为 friend
。 friend
声明不会引入嵌套的 class 名称。不过,它会使找到的嵌套 class 变成 friend
。
假设我有两个 class 定义如下:
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;
}
效果很好。总的来说,如果我声明一个obj2类型的对象,然后调用它的method2成员函数,它就可以成功地从obj1的一个实例中访问私有变量。现在,假设我将这些 classes 嵌套:
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;
}
这将无法编译。它说 "mem" 是私有的,即使 obj2 被声明为朋友 class。解决此问题的唯一方法是将 class obj2 的前向声明放在 obj1 的 Class 定义之前。然而,如果 classes 没有嵌套,我就不必这样做。 这是为什么?
声明为 friend
的 class 在 friend
声明的上下文中查找。如果找到一个,这个 class 就变成 friend
。如果找到 none,则在最近的命名空间级别声明 class,并将此 class 设为 friend
。 friend
声明不会引入嵌套的 class 名称。不过,它会使找到的嵌套 class 变成 friend
。