在类本身内存储类的对象

时间:2013-04-09 22:24:55

标签: c++

如何在类本身中存储类的对象?

我知道我必须使用static关键字来完成我想要的。因此,课程应该类似于:

class my_class {
public:
    static my_class instance;
    my_class() {
        my_class::instance = this
    }
};

以下是类

中显示的确切代码
namespace ArmISA {
    class ISA {
        protected:
            static ISA* isa;
            MiscReg miscRegs[NumMiscRegs];
            const IntRegIndex *intRegMap;
            .....
        public:
            ISA() {
                ISA::isa = this;
                ...
            }
        ...
    };
}

我得到的错误是:

  

错误:无法将'ArmISA :: ISA :: isa'从'ArmISA :: ISA *'转换为'ArmISA :: ISA'

3 个答案:

答案 0 :(得分:1)

my_class::instance = *this;可以使用,但我希望你知道每次创建一个新的类实例时,你的instance成员都会被覆盖。此外,这意味着instance*this的副本,而不是参考 - 对另一个的更改对另一个是不可见的。

另一种选择是将instance声明为指针,在这种情况下,两个指针都引用同一个对象,然后instance = this;将编译:

static my_class* instance;

但是,我不确定你到底想要达到的目标。

答案 1 :(得分:0)

this是一个指针。使用my_class::instance = *this

答案 2 :(得分:0)

要初始化非整数类型的静态成员变量(或者,在C ++ 11中,非 - constexpr),请在类外部执行此操作。

例如:

struct Foo
{
    static Foo bar;
    double x_;
    Foo( double x ): x_( x ) {}
};

// Preferably in an implementation file:
Foo Foo::bar( 3.14 );

类外的声明总是正式的定义,它为变量提供存储(如果你接受地址则需要)。


如果要提供仅头文件模块,可以通过一个函数提供对静态变量的访问,如下所示:

struct Foo
{
    static Foo& bar()
    {
        static Foo theBar( 3.14 );
        return theBar;
    }

    double x_;
    Foo( double x ): x_( x ) {}
};

另一种技术是从提供静态变量的类模板继承。