VC学习之类的类成员初始化

来源:互联网 发布:网络安全技术是什么 编辑:程序博客网 时间:2024/05/16 12:09
静态类的初始化要放在.cpp 文件中,在类体外显式初始化
成员变量可在构造函数中初始化。
如果成员变量也在类体外初始化,则变成了全局变量了。
如果不初始化,要在头文件中声明,直接在.cpp 文件中声明并傅
VC 类的静态成员,需要在.cpp 中初始化,如果不初始化,则会报错如下
 
错误 1 error LNK2001: 无法解析的外部符号 "public: static enum ServerStatus ServerStatusInfo::cpsStatus" (?cpsStatus@ServerStatusInfo@@2W4ServerStatus@@A) D:\Source\trade2from7.10\DTS\sdjy\ServerStatusHelper.obj SDJY
 
如果有些数据成员无法赋值,则不赋值也可以,但一定要写
ServerStatusInfo.h 声明如下:
class ServerStatusInfo{public:    static vector<ServerStatusListener> m_serverStatusListenerList;//保存需要处理Server状态回调的窗口 ~ServerStatusInfo(){ } ServerStatusInfo(){} static ServerStatus cpsStatus ;static ServerStatus scsStatus ;static ServerStatus sslStatus ;static void * scsSession;static void * sslSession;string name; //非静态成员要在构造函数中初始化,如果在类外部初始化,就变成全局的了 static void AddServerStatusListener(ServerStatusListener listener); static void RemoveServerStatusListener(ServerStatusListener listener); static void OnCPSStatusChanged(ServerStatus cpsStatus); static void OnSCSStatusChanged(ServerStatus scsStatus); static void OnSSLStatusChanged(ServerStatus sslStatus); static void OnLMStatusChanged(char* marketCode,int isOk); static void OnQutoStatusChanged(char* marketCode,int isOk);};ServerStatusInfo.cpp 的定义如下: #include "stdafx.h"#include "ServerStatusInfo.h"using namespace std;//Server状态初始ServerStatus ServerStatusInfo::cpsStatus = unknown;ServerStatus ServerStatusInfo::scsStatus = unknown;ServerStatus ServerStatusInfo::sslStatus = unknown;void * ServerStatusInfo::scsSession ;void * ServerStatusInfo::sslSession ;vector<ServerStatusListener> ServerStatusInfo::m_serverStatusListenerList;void ServerStatusInfo::AddServerStatusListener(ServerStatusListener listener){m_serverStatusListenerList.push_back(listener);}void ServerStatusInfo::RemoveServerStatusListener(ServerStatusListener listener){//m_serverStatusList.erase(listener);}void ServerStatusInfo::OnCPSStatusChanged(ServerStatus cpsStatus){for each (ServerStatusListener listener in m_serverStatusListenerList) {listener.OnCPSStatusChanged(cpsStatus);}}void ServerStatusInfo::OnSCSStatusChanged(ServerStatus scsStatus){for each (ServerStatusListener listener in m_serverStatusListenerList) {listener.OnSCSStatusChanged(scsStatus);}}void ServerStatusInfo::OnSSLStatusChanged(ServerStatus sslStatus){for each (ServerStatusListener listener in m_serverStatusListenerList) {listener.OnSSLStatusChanged(sslStatus);}}void ServerStatusInfo::OnLMStatusChanged(char* marketCode,int isOk){for each (ServerStatusListener listener in m_serverStatusListenerList) {listener.OnLMStatusChanged(marketCode,isOk);}}void ServerStatusInfo::OnQutoStatusChanged(char* marketCode,int isOk){for each (ServerStatusListener listener in m_serverStatusListenerList) {listener.OnQutoStatusChanged(marketCode,isOk);}}void ServerStatusListener::OnCPSStatusChanged(ServerStatus status) {OnCPSStatusChanged(status);}void ServerStatusListener::OnSCSStatusChanged(ServerStatus status){OnSCSStatusChanged(status);}void ServerStatusListener::OnSSLStatusChanged(ServerStatus status) {OnSSLStatusChanged(status);}void ServerStatusListener::OnLMStatusChanged(char* marketCode,int isOk) {OnLMStatusChanged(marketCode,isOk);}void ServerStatusListener::OnQutoStatusChanged(char* marketCode,int isOk) {OnQutoStatusChanged(marketCode,isOk);}



默认参数的声明 :
void CheckDTSUserID(string userID,string pwd,string checkUserIsExist = "1",string requestType = "0",string counterPartyCode = "00",string accountType ="S"); 


 
定义时,不需要带默认参数了
void LoginSSHelper::CheckDTSUserID(string userID,string pwd,string checkUserIsExist ,string requestType ,string counterPartyCode ,string accountType )  


静态成员如果不用类名访问会报出奇怪的错误,例如:
controlSSBean.InEventCharDic["DTSUserID"] = ServerStatusHelper.getInstance()->GetEnvironment().GetOwnerID();  


则会报出错:
错误 2 error C2275: “ServerStatusHelper”: 将此类型用作表达式非法 d:\source\trade2from7.10\dts\sdjy\loginsshelper.cpp 82 1 SDJY
错误 5 error C2228: “.GetOwnerID”的左边必须有类/结构/联合 d:\source\trade2from7.10\dts\sdjy\loginsshelper.cpp 82 1 SDJY
错误 3 error C2228: “.getInstance”的左边必须有类/结构/联合 d:\source\trade2from7.10\dts\sdjy\loginsshelper.cpp 82 1 SDJY
错误 4 error C2227: “->GetEnvironment”的左边必须指向类/结构/联合/泛型类型 d:\source\trade2from7.10\dts\sdjy\loginsshelper.cpp 82 1 SDJY




改成如下即可:
controlSSBean.InEventCharDic["DTSUserID"] = ServerStatusHelper::getInstance()->GetEnvironment().GetOwnerID();