有一段时间没有用C++了,今天写了一个简单的单例模式,然后CLion一直报错,链接错误,用VS跑结果一样,也不行

VS错误信息:

CLion和C++类内静态成员定义问题

CLion:

CLion和C++类内静态成员定义问题

问题在于

Singleton.h

class Singleton
{
private:
    Singleton();
    static Singleton *p;
public:
    static Singleton* getInstance();
};

Singleton* Singleton::p = nullptr;

这里的p指针的初始化不能放在头文件里面初始化,必须放在对应的实现文件里面Singleton.cpp里面来初始化,但是CLion在Singleton.cpp中编写代码的时候如图:

CLion和C++类内静态成员定义问题

代码提示中并没有p指针,很容易让我们误以为这里面不能在cpp文件中来初始化。

 

总而言之,你要不就只有一个Singleton.h文件,然后里面声明和实现都写好(这样也是不会报错的),如果有一个Singleton.cpp文件来实现,就必须把几乎所有(除开例如静态常量的初始化、内联函数的实现等)的初始化或者实现都写在.cpp文件中,不能一部分实现放在.cpp中,一部分放在.h中,暂时的实验的出来的是这样的结论。

这边报的链接错误,是.cpp文件生成.obj文件之后链接成可执行文件的时候出现了多重定义,,如果你把CLion和C++类内静态成员定义问题

这一行代码放到.h中报的就是多重定义,如果你把这一行代码从.h中删掉,.cpp中也不定义,出现的就是无法解析。

这里的多重定义是Singleton.cpp生成的.obj文件和main.cpp生成的obj文件中都定义了这个指针我认为。

 

欢迎指正

相关文章:

  • 2021-11-30
  • 2021-08-10
  • 2021-04-26
  • 2021-06-03
  • 2022-03-01
  • 2021-11-30
猜你喜欢
  • 2021-10-03
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-26
  • 2021-11-21
相关资源
相似解决方案