这几天做项目用到了设计模式中的状态模式,状态是根据事件驱动的,起初在一个GlobalEventName.h文件中定义了所有的事件名,是这种样子:
//事件
const char* CCERinging = "Ringing" ;
const char* CCERelease = "Release" ;
const char* CCEReady = "Ready" ;
const char* CCEDial = "Dialing" ;
const char* CCEEstablish = "Established" ;
const char* CCEHold = "Hold" ;
const char* CCEConsult = "Consult" ;
const char* CCEConference = "Conference" ;
然后在各个状态类的cpp文件中include该GlobalEventName.h文件,例如:
#include "ReadyState.h"
#include "RingState.h"
#include "WaitState.h"
#include "EventHandle.h"
#include "GlobalEventName.h"
#include <iostream>
#include <string>
ReadyState::ReadyState()
{
std::cout << "进入ReadyState" << std::endl;
}
void ReadyState::Handler(EventHandle *eventHandle)
{
std::string eventName = eventHandle->getEventName();
std::cout << "当前状态为 ReayState, 接收到:" << eventName << std::endl;
if (0 == eventName.compare(CCERinging)) //接收到振铃事件
{
eventHandle->ChangeState(new RingState());
}
else if (0 == eventName.compare(CCADial)) //接收到拨号操作
{
eventHandle->ChangeState(new WaitState());
}
else
{
std::cout << "不能处理" << eventName << std::endl;
}
}
这样在编辑的时候虽然没有,但是在链接时会出现一大堆的error,全部是关于LNK2005,char const * xxx already defined in yyyy.obj,在网友的指导下,指导了错误原因,网友具体描述如下:
头文件中不能包含定义,但可以包含声明;
要是包含定义,那么每个模块包含的时候就会被定义一次,因为这个变量是全局的,所以,链接的时候会导致多个定义,从而产生了该错误
有两种修改方法:
- 在GlobalEventName.h文件中,将每个全局变量都声明为static
- 在GlobalEventName.h文件中,只是声明,并且在声明的时候加上extern关键字,然后在一个cpp文件中定义这些变量
我使用的是第二种方法,将GlobalEventName.h文件中改为如下内容:
//事件
extern const char* CCERinging;
extern const char* CCERelease;
extern const char* CCEReady;
extern const char* CCEDial;
extern const char* CCEEstablish ;
extern const char* CCEHold;
extern const char* CCEConsult;
extern const char* CCEConference;
然后增加一个GlobalEventName.cpp文件,在该文件中完成定义:
//事件
const char* CCERinging = "Ringing" ;
const char* CCERelease = "Release" ;
const char* CCEReady = "Ready" ;
const char* CCEDial = "Dialing" ;
const char* CCEEstablish = "Established" ;
const char* CCEHold = "Hold" ;
const char* CCEConsult = "Consult" ;
const char* CCEConference = "Conference" ;
这样,在链接的时候,就不会再有这种错误了。