C++中static类成员的定义和声明

jiaoyun007 2019-09-08 09:10:28
各位好,遇到个这么个问题,实现了一个单例模式,要是将其中的mutex Log::myMtx注释掉,编译就通不过,系统提示:

jeff@ubuntu-jeff:/mnt/hgfs/Shared$ g++ -o single single_pattern.cpp
/tmp/ccCCI4Mw.o:在函数‘Log::createLogInstance()’中:
single_pattern.cpp:(.text._ZN3Log17createLogInstanceEv[_ZN3Log17createLogInstanceEv]+0x18):对‘Log::myMtx’未定义的引用
single_pattern.cpp:(.text._ZN3Log17createLogInstanceEv[_ZN3Log17createLogInstanceEv]+0x4c):对‘Log::myMtx’未定义的引用
collect2: error: ld returned 1 exit status

好像是说没定义,在类中的这行:

static mutex myMtx;

不算定义吗,谢谢各位!

代码如下:

#include <iostream>
#include <mutex>

using namespace std;

class Log
{
public:
static Log* createLogInstance()
{
if(_instance == NULL)
{
myMtx.lock();

if(_instance == NULL)
_instance = new Log;

myMtx.unlock();
}

return _instance;
}

private:
Log(){}
~Log()
{
if(_instance != NULL ) delete _instance;
}

static Log *_instance;
static mutex myMtx; //这行不算定义吗?
};

Log *Log::_instance = NULL;
mutex Log::myMtx; //这行注释掉,就编译不过

...全文
201 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiaoyun007 2019-09-09
  • 打赏
  • 举报
回复
引用 2 楼 的回复:
static类成员的定义和声明规则如下:

//1)在静态内存区中
//2)所有类对象共用这一个变量,只有唯一一个
//3)必须在类外面显示定义,显示定义的时候不加static
//4)可以通过类对象访问,也可以通过类名加作用域访问


多谢!说的够清楚!
jiaoyun007 2019-09-09
  • 打赏
  • 举报
回复
引用 1 楼 uouo88 的回复:
类中的 static mutex myMtx; 这行不算定义只是一个声明,类外面的这行 mutex Log::myMtx; 才是定义。成员在使用前必须定义,否则就会出现你遇到的错误,一般把声明部分放在.h文件中,而把定义部分放在.cpp文件中。


多谢!说的一目了然
slwj 2019-09-08
  • 打赏
  • 举报
回复
static类成员的定义和声明规则如下: //1)在静态内存区中 //2)所有类对象共用这一个变量,只有唯一一个 //3)必须在类外面显示定义,显示定义的时候不加static //4)可以通过类对象访问,也可以通过类名加作用域访问
uouo88 2019-09-08
  • 打赏
  • 举报
回复
类中的 static mutex myMtx; 这行不算定义只是一个声明,类外面的这行 mutex Log::myMtx; 才是定义。成员在使用前必须定义,否则就会出现你遇到的错误,一般把声明部分放在.h文件中,而把定义部分放在.cpp文件中。

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧