关于c ++:在静态类中初始化静态指针

Initializing static pointer in static class

本问题已经有最佳答案,请猛点这里访问。

所以我有以下C++类

1
2
3
4
5
6
7
8
9
10
11
class MyClass:

public:

    static void InitObject();

private:

    static MyObject *myObject;      

};

然后在.cpp文件中

1
2
3
4
void MyClass::InitObject
{
    myObject = new MyObject();
}

但是,我得到一个编译器错误,它说"myObject"是从initObject()引用的,然后它说链接器命令失败,退出代码为1。

为什么这个不行?我该怎么修?


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

您可以在单独的翻译单元(在CPP文件中)中这样做:

1
MyObject *MyClass::myObject;

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


扩展.cpp文件,对myObject使用以下定义:

1
MyObject* MyObject::myObject = NULL;

注:对于您的特定案例,您最好说:

1
2
3
4
5
6
7
8
class MyClass:
{
public:
    static MyClass& instance();

private:
    MyClass() {}
};

在.cpp文件中:

1
2
3
4
5
MyClass& MyClass::instance()
{
    static MyClass myInstance;
    return myInstance;
}

比起使用new MyClass(),我更喜欢这个。任何对instance()方法的访问都将保证您的实例被完全初始化一次,并且您将获得对它的有效引用。"space"在堆栈上被完全分配,作为引用和实例本身。


您从未为MyObject::myObject分配空间。将其放入cpp文件:

1
MyObject* MyObject::myObject;