有一段时间没有用C++了,今天写了一个简单的单例模式,然后CLion一直报错,链接错误,用VS跑结果一样,也不行
VS错误信息:
CLion:
问题在于
Singleton.h
class Singleton
{
private:
Singleton();
static Singleton *p;
public:
static Singleton* getInstance();
};
Singleton* Singleton::p = nullptr;
这里的p指针的初始化不能放在头文件里面初始化,必须放在对应的实现文件里面Singleton.cpp里面来初始化,但是CLion在Singleton.cpp中编写代码的时候如图:
代码提示中并没有p指针,很容易让我们误以为这里面不能在cpp文件中来初始化。
总而言之,你要不就只有一个Singleton.h文件,然后里面声明和实现都写好(这样也是不会报错的),如果有一个Singleton.cpp文件来实现,就必须把几乎所有(除开例如静态常量的初始化、内联函数的实现等)的初始化或者实现都写在.cpp文件中,不能一部分实现放在.cpp中,一部分放在.h中,暂时的实验的出来的是这样的结论。
这边报的链接错误,是.cpp文件生成.obj文件之后链接成可执行文件的时候出现了多重定义,,如果你把
这一行代码放到.h中报的就是多重定义,如果你把这一行代码从.h中删掉,.cpp中也不定义,出现的就是无法解析。
这里的多重定义是Singleton.cpp生成的.obj文件和main.cpp生成的obj文件中都定义了这个指针我认为。
欢迎指正