C++ C+中是否存在静态嵌套类+;像Java?

C++ C+中是否存在静态嵌套类+;像Java?,c++,C++,我经常用java写东西, 我对C++中的静态嵌套类有点困惑。 我试图声明静态类,但出现错误: class D { public: static class Listener { public : void foo() { cout << "foo" <<endl; } }; }; D类 { 公众: 静态类侦听器 { 公众: void foo()

我经常用java写东西, 我对C++中的静态嵌套类有点困惑。 我试图声明静态类,但出现错误:

class D
{
    public:

    static class Listener
    {
        public :

        void foo()
        {
            cout << "foo" <<endl;
        }
    };

};
D类
{
公众:
静态类侦听器
{
公众:
void foo()
{

正确的术语应该是“静态嵌套类”

java中的静态嵌套类就像C++中的普通嵌套类,所以只需删除<代码>静态< /代码>,它就可以正常工作。


在C++中非静态的仿真程序会有点困难,因为没有编译器魔法来自动提供外部类的上下文。您必须在内部类中存储对外部类的引用,在内部类的构造函数中初始化它,并访问第三个类的成员,来解决这个问题。通过引用显式地定义外部类。C++中的

< P>类只是嵌套类型定义,因此只充当嵌套类型定义的命名空间。< /P> 如果将类类型定义声明为static anywhere(嵌套或非嵌套),则会收到一条编译器警告,该警告将被删除。类不能有存储类说明符,并且static已在类内重新调整用途。这是因为类类型根本没有存储,只是模板(因此,这种联系毫无意义;它们甚至无法存活那么久),和方法定义是编译器在选择时能够具体化的编译器指令,但可以很容易地从程序集输出中排除,这与常规函数不同,常规函数在放置到另一个翻译单元时保证存在,因此所有类成员都有效地
内联
(除非
static
,否则它们需要显式内联以提供内联定义)。
static
在类内部的类上使用是多余的,因为从这个意义上讲类是隐式嵌套的
static

当您实例化父类时,它不包括嵌套类,因为这只是一个编译器指令。您必须将该类的一个对象作为成员之一,其中类类型定义在范围内:

class c {
  public :
  int i;
  class s f; //not allowed
  class s;
  class s k; //not allowed, still has forward declaration type
  class s {
    public:
    int j;    
  };
  s p; // allowed
};
可以在类中正向声明嵌套类,但不能使用正向声明不完整类型定义成员,除非该成员是指向该成员的指针或引用,但如果该成员的类型在作用域中已在其上方完成,则该成员可以使用不完整类型


但是,与命名空间不同的是,您不能从嵌套类访问父类的非静态成员(这种类型的静态和非静态成员无论如何都不存在于命名空间中)。这是因为嵌套类单独实例化为父类,父类可能永远不会实例化。程序员可能会初始化父对象中的嵌套对象,就像它可以将其存储在对象中的指针或本地指针中,并在堆上初始化它一样,但在对象级别l、 它们是独立的对象,它们的类型定义不相关。如果调用父类的非静态成员,编译器必须将父类的对象传递给它。理论上,它可以使用父类类型定义来确定它在内存中填充的成员的偏移量,但它可能会t不一定是父对象的子对象。为了允许此功能,如果子类在没有父类实例化的情况下实例化,并将其指定为父子对象的子对象,则编译器必须抛出错误。

只需跳过
静态
,应该可以。这不是必需的C++中的内部类中没有这样的“外部”类上下文。默认情况下它们就像java“static”类。<代码>静态内联是:“内部类是一个嵌套类,没有明确或隐式地声明静态”。java中没有“<代码>静态内嵌/代码>类”。“静态嵌套类”和“非静态嵌套类”将是正确的术语“EJP:我在这里固定:”完全清楚:C++中的正确术语是“嵌套类”。C++中没有嵌套或其他类型的“静态类”。