所以我有以下c ++类
class MyClass:
public:
static void InitObject();
private:
static MyObject *myObject;
};
然后在.cpp文件中我做
void MyClass::InitObject
{
myObject = new MyObject();
}
但是,我收到一个编译器错误,说“myObject”是从InitObject()引用的,然后它说Linker命令失败,退出代码为1.
为什么这不起作用?我该如何解决?
答案 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()
方法的任何访问权限保证您的实例只会初始化一次,并且您将获得对它的有效引用。
然后“空间”完全分配在堆栈上,以及实例本身的参考。