C++:外部类中内部类的静态实例

标签 c++ static inner-classes

我写了一些代码,如下所示。 这里有一个外部类和一​​个内部类。 我想要一个类似于java内部静态类的功能。 所以我将内部类对象声明为静态。 输出很好:

#include <iostream>

using namespace std;

class X {

    private:
    X() {}
    public:

        class Y {
            public:
                virtual void f() = 0;
        };
        class Z:public Y {
            public:
                Z(X& val) : x(val) {}
                void f() {
                    cout << "Programming";
                    x.i = 5;
                }
            private:
                X& x;
        };
        static Z getZ() {
            return z;
        }
    private:
        static Z z;
        int i;
};

X::Z  X::z = X::getZ();

int main()
{
    X::getZ().f();
    return 0;
}

虽然我无法理解这种说法。它是如何工作的?

X::Z  X::z = X::getZ();

编辑:那么如何初始化内部类的实例? 另外,当我在下面分配时,我遇到了段错误,这可能是由于 self 分配所致。

 x.i = 5;

最佳答案

由于z是静态成员变量,因此需要定义。您正在查看的代码行就是该定义。

X::Z  X::z = X::getZ();

X::Z (注意大写的 Z)是类型,X::z (注意小写的 z ) 是变量,它由 X::getZ() 静态成员函数的返回值初始化。

事实证明,X::getZ() 只是返回 X::z。虽然它看起来多余,但它抑制了 X::z 的默认构造函数的执行,并改用复制构造函数。

在执行静态初始化之前,静态对象被零初始化。如果对象通过零初始化正确初始化,则 self 上的复制构造函数不会造成任何特别的损害。但是,在本例中,X::Z 有一个引用成员变量 x,该变量初始化为零。访问 x 会导致未定义的行为。


您添加了一个有关静态成员 z 正确初始化的附加问题。

由于您以 X::getZ() 的形式为 z 提供访问器方法,因此更好的解决方案是避免使用静态成员变量,并将X::getZ() 函数本身内部的静态实例。由于 z 需要正确初始化 X 的实例,因此应该提供一个。

class X {
//...
public:
    static Z & getZ() {
        static X x;
        static Z z(x);
        return z;
    }
private:
    int i;
};

X::getZ()的返回类型更改为对静态实例的引用,以便可以操作该实例。

关于C++:外部类中内部类的静态实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30109760/

相关文章:

c++ - 计算包含对象的this指针

java - 从内部类 : needs to be declared final error java swing 中访问局部变量

c++ - 这个静态变量赋值给局部函数中的指针有什么问题?

c++ - 使用字符串文字而不使用命名空间 std

c++ - 为什么 pmr::string 在这些基准测试中这么慢?

c++ - 确定网络连接链接速度

android - 在应用程序中存储 hashmap 数据

java - 非静态内部类对象在不再被引用后会被垃圾回收吗?

C++多线程环境下静态变量的初始化

c# - 有没有办法枚举一个类中的所有静态函数?