HI,关于产品C++内部类
在C++中的内部类,
class A {
public:
void f1();
private:
void f2();
class B {
private void f3();
};
}
是否一个内部类(B)具有一个指向它的父类(A)? (就像它在Java中那样)。 而且B可以调用它的父类public/private方法(就像它在Java中一样)。
谢谢。
HI,关于产品C++内部类
在C++中的内部类,
class A {
public:
void f1();
private:
void f2();
class B {
private void f3();
};
}
是否一个内部类(B)具有一个指向它的父类(A)? (就像它在Java中那样)。 而且B可以调用它的父类public/private方法(就像它在Java中一样)。
谢谢。
否 - 在C++中,嵌套类仅影响名称和可见性,而不影响类本身的语义。就生成的代码而言,嵌套类与嵌套类没有区别。
所有改变的是可见性和名称(例如,如果它位于外部类的private:
部分中,它对外界不可见,并且如果它位于public:
部分中,则它是可见的,但是(当然)你可以使用outer_class::inner_class
,它仍然是一个完全独立的类 - 例如,你可以创建一个内部类的实例,而不需要创建任何外部类的实例。
编辑:对不起,我错过了部分你的问题在C++ 0x中,内部类可以访问外部类的私有部分 - 实质上,就好像外部类已经将内部类声明为它的朋友一样,所以私有名称是可见的,但是你仍然需要传递一些东西就像引用外部类的对象,然后它可以调用外部类的任何非静态成员函数。
虽然这不应该是这种情况,但我相信大多数编译器已经实现了这个特定的部分。
不,B类没有指向A类的指针,除非您明确地添加它。
它有一个指向父:第
是否有机会获得父母的私有成员:排序的
我觉得如果访问没有很好地界定标准我可以错误。
但是你可以用g ++
#include <iostream>
class X
{
class Y
{
public:
Y(X* p)
:parent(p)
{}
void TryY()
{
// Access a private member of X
++(parent->value);
}
private:
X* parent;
};
public:
X()
:y(this)
{
value = 4;
}
void TryY()
{
y.TryY();
std::cout << value << std::endl;
}
private:
Y y;
int value;
};
int main()
{
X x;
x.TryY();
}
根据*§11.8/ 1 *,C++ 03应该是不正确的行为。 – 2010-04-22 01:34:22
看来,这是C++ 0x中不断变化的访问。 C++ 03说:“嵌套类的成员对封闭类的成员没有特殊访问权。” C++ 0x FCD表示:“嵌套类是一个成员,因此与任何其他成员具有相同的访问权限。” (均为§11.8/ 1)。 (该更改由CWG缺陷45和494引入:http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#45和http://www.open-std.org/ jtc1/sc22/wg21/docs/cwg_defects.html#494) – 2010-04-22 01:12:07
不错 - 这消除了编写'friend class {'的冲动,它受到一些编译器的支持,但显然不会使嵌套类不是成员! – Potatoswatter 2010-04-22 02:39:43
@Potato:有趣的是,即使在严格的C++ 03模式下的Comeau也不遵循C++ 03语言。这使我相信(a)可能出于某种原因遵循C++ 03语言(虽然我还没有弄清楚为什么,除了上面链接的DR所提及的原因外)和( b)很可能没有人真正遵循C++ 03语言:-)。 – 2010-04-22 16:20:46