VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 745|回复: 7

关于类成员静态变量的使用问题,提问

[复制链接]

1

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-2-9 12:30:01 | 显示全部楼层 |阅读模式
我想用一个类status,类成员都用静态变量来记录程序的实时改变的状态信息,

但在对话框cmydialog的初始化函数中对其静态变量初始化时报错:
unresolved external sysmbol :public static status我的静态变量成员……

如果把cmydialog.cpp中的#include "status.h" 删除,则无法识别status类,加入include句,则报上面的错误

那位大侠指点一下?

回复

使用道具 举报

0

主题

70

帖子

42.00

积分

新手上路

Rank: 1

积分
42.00
发表于 2020-4-4 17:45:01 | 显示全部楼层
静态变量要在类外初始化,例如:

//abc.h

class abc
{
public:
    static int i;
}

// abc.cpp

int abc::i = 0;  // 要这样初始化
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-4-5 16:30:01 | 显示全部楼层
楼上说得有道理,我这里需要提醒的是
在C++中,静态变量分为声明和定义

在你所说的情况中,你可能只声明了,但是你必须在你的cpp文件中定义它
回复

使用道具 举报

1

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-4-19 19:45:01 | 显示全部楼层
谢谢两位的帮助,我把情况再说的具体一些,希望能够获得解决问题的方法:

我的是一个对话框程序,主对话框文件
CmyDialog.h  CmyDialog.cpp
还有一个我用应用程序向导生成的自定义类
Cstatus.h   Cstatus.cpp
在该类中我定义了四个静态变量
这是其中一个:static bool connected;
我有一个手动添加的全局函数文件
common.h  和 common.cpp

我在common.cpp中有下列代码:

#include "Cstatus.h"

void Initialize()
{
   Cstatus::connected = false;
}

在对话框的初始化函数中调用此函数,在文件CmyDialog.cpp中有下列代码
#include "common.h"
#include "CStatus.h"

CmyDialog::OnInitDialog()
{
   Initialize();
}


结果会报错误
error LNK2001: unresolved external symbol "public: static bool Cstatus::connected"(?connected@StaticStatus@@2_NA)
帮忙告知原因,或者有没有好的建议实现对类Cstatus中静态变量的初始化;
回复

使用道具 举报

1

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-4-20 00:45:01 | 显示全部楼层
谢谢两位的帮助,我把情况再说的具体一些,希望能够获得解决问题的方法:  
上面说的漏掉一点,这个给改正!

我的是一个对话框程序,主对话框文件  
CmyDialog.h    CmyDialog.cpp  
还有一个我用应用程序向导生成的自定义类  
Cstatus.h      Cstatus.cpp  
在该类中我定义了四个静态变量  
这是其中一个:static  bool  connected;  
我有一个手动添加的全局函数文件  
common.h    和  common.cpp  

我在common.cpp中有下列代码:  

#include    "Cstatus.h  "  


Cstatus status;
void  Initialize()  
{  
     Cstatus::connected  =  false;
     //status.connected = false;

}  

在对话框的初始化函数中调用此函数,在文件CmyDialog.cpp中有下列代码  
#include    "common.h  "  
#include    "CStatus.h  "  

CmyDialog::OnInitDialog()  
{  
     Initialize();  
}  


结果会报错误  
error  LNK2001:  unresolved  external  symbol    "public:  static  bool  Cstatus::connected  "(?connected@StaticStatus@@2_NA)  
帮忙告知原因,或者有没有好的建议实现对类Cstatus中静态变量的初始化;
回复

使用道具 举报

0

主题

70

帖子

42.00

积分

新手上路

Rank: 1

积分
42.00
发表于 2020-4-22 17:15:01 | 显示全部楼层
把  bool Cstatus::connected  =  false;  这句放到 cpp 文件的开始位置

然后把

void  Initialize()  
{  
     //Cstatus::connected  =  false;  评比掉 就行 静态成员函数必须在类的外部初始化
     //status.connected = false;

}
回复

使用道具 举报

0

主题

70

帖子

42.00

积分

新手上路

Rank: 1

积分
42.00
发表于 2020-4-22 20:00:01 | 显示全部楼层
例如

Cstatus status;

bool Cstatus::connected  =  false;

void  Initialize()  
{  

}  
回复

使用道具 举报

1

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-4-30 12:15:01 | 显示全部楼层
我在类里用了静态的结构,按照你说的方法还是通不过,
现在我把整个全局类作为状态类维护,就不用static了,
不过还是谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表