在静态类中初始化静态指针

时间:2013-11-23 02:47:22

标签: c++ class pointers static linker

所以我有以下c ++类

class MyClass:

public: 

    static void InitObject();

private:

    static MyObject *myObject;       

};

然后在.cpp文件中我做

void MyClass::InitObject
{
    myObject = new MyObject();
}

但是,我收到一个编译器错误,说“myObject”是从InitObject()引用的,然后它说Linker命令失败,退出代码为1.

为什么这不起作用?我该如何解决?

3 个答案:

答案 0 :(得分:5)

由于C ++中类的静态数据成员需要与实例内存分开的内存空间,除了在类中声明 之外,它们还需要定义

您可以在单独的翻译单元(在您的CPP文件中)执行此操作,如下所示:

MyObject *MyClass::myObject;

该定义告诉编译器在静态内存区域为myObject分配空间。如果没有这个定义,代码将编译,但链接器将报告错误,因为它负责确保所有引用的静态对象都分配了内存。

答案 1 :(得分:1)

您从未为MyObject::myObject分配空间。把它放在CPP文件中:

MyObject* MyObject::myObject;

答案 2 :(得分:1)

使用myObject的{​​{3}}扩展您的.cpp文件:

MyObject* MyObject::myObject = NULL;

注意:
对于您的特定情况,您最好说:

class MyClass:
{
public: 
    static MyClass& instance();

private:
    MyClass() {}
};

并在.cpp文件中:

MyClass& MyClass::instance()
{
    static MyClass myInstance;
    return myInstance;
}

我更喜欢使用new MyClass()。对instance()方法的任何访问权限保证您的实例只会初始化一次,并且您将获得对它的有效引用。
然后“空间”完全分配在堆栈上,以及实例本身的参考。