C++ 状态模式异常
C++ State pattern exception
我是 C++ 新手!
请帮助我实现状态模式。
我有以下代码,但无法编译:
class MasterThreadState;
class Init; class Idle;
class MasterThread
{
public:
MasterThread(){
_state = Init::State();
}
void handle(int sender, int tag);
private:
int _sender;
MasterThreadState* _state;
private:
friend class MasterThreadState;
void goTo(MasterThreadState* newState){ _state = newState; }
};
class MasterThreadState
{
public:
virtual void recieved(MasterThread& master, int tag);
protected:
void goTo(MasterThread& m, MasterThreadState* newState){
m.goTo(newState);
}
};
class Init : MasterThreadState {
public:
static MasterThreadState& State() { return instance; }
virtual void recieved(MasterThread& master, int tag);
private:
static Init instance;
};
class Idle : MasterThreadState {
public:
void recieved(MasterThread& master,int tag);
static MasterThreadState& State(){ return instance; }
private:
static Idle instance;
};
错误是:
嵌套名称说明符中使用了不完整类型 'Init'
_state = Init::State();
虚函数没有实现
这段代码工作正常:
class MasterThreadState;
class Init; //class Idle;
class MasterThread
{
public:
MasterThread();
void handle(int sender, int tag);
private:
int _sender;
MasterThreadState* _state;
private:
friend class MasterThreadState;
void goTo(MasterThreadState* newState){ _state = newState; }
};
class MasterThreadState
{
public:
virtual void recieved(MasterThread& master, int tag) = 0;
protected:
void goTo(MasterThread& m, MasterThreadState* newState){
m.goTo(newState);
}
};
class Init : MasterThreadState {
public:
static MasterThreadState* State();
virtual void recieved(MasterThread& master, int tag);
private:
Init(){}
};
class Idle : MasterThreadState {
public:
static MasterThreadState* State();
virtual void recieved(MasterThread& master,int tag);
private:
static Idle instance;
};
如果在 Init 声明之后移动 MasterThread 构造函数,代码将编译(并构建):
class MasterThread
{
public:
MasterThread();
void handle(int sender, int tag);
private:
int _sender;
MasterThreadState* _state;
private:
friend class MasterThreadState;
void goTo(MasterThreadState* newState){ _state = newState; }
};
class MasterThreadState
{
public:
virtual void recieved(MasterThread& master, int tag) {}
protected:
void goTo(MasterThread& m, MasterThreadState* newState){
m.goTo(newState);
}
};
class Init : MasterThreadState {
public:
static MasterThreadState* State() { return &instance; }
virtual void recieved(MasterThread& master, int tag) {}
private:
static Init instance;
};
Init Init::instance;
MasterThread::MasterThread() {
_state = Init::State();
}
注意,Init::State() 应该 return 指针,MasterThreadState*
。这也发生了变化,定义了静态成员 Init::instance,并将虚函数的实现(空)正确添加到 link。
我是 C++ 新手! 请帮助我实现状态模式。
我有以下代码,但无法编译:
class MasterThreadState;
class Init; class Idle;
class MasterThread
{
public:
MasterThread(){
_state = Init::State();
}
void handle(int sender, int tag);
private:
int _sender;
MasterThreadState* _state;
private:
friend class MasterThreadState;
void goTo(MasterThreadState* newState){ _state = newState; }
};
class MasterThreadState
{
public:
virtual void recieved(MasterThread& master, int tag);
protected:
void goTo(MasterThread& m, MasterThreadState* newState){
m.goTo(newState);
}
};
class Init : MasterThreadState {
public:
static MasterThreadState& State() { return instance; }
virtual void recieved(MasterThread& master, int tag);
private:
static Init instance;
};
class Idle : MasterThreadState {
public:
void recieved(MasterThread& master,int tag);
static MasterThreadState& State(){ return instance; }
private:
static Idle instance;
};
错误是:
嵌套名称说明符中使用了不完整类型 'Init' _state = Init::State();
虚函数没有实现
这段代码工作正常:
class MasterThreadState;
class Init; //class Idle;
class MasterThread
{
public:
MasterThread();
void handle(int sender, int tag);
private:
int _sender;
MasterThreadState* _state;
private:
friend class MasterThreadState;
void goTo(MasterThreadState* newState){ _state = newState; }
};
class MasterThreadState
{
public:
virtual void recieved(MasterThread& master, int tag) = 0;
protected:
void goTo(MasterThread& m, MasterThreadState* newState){
m.goTo(newState);
}
};
class Init : MasterThreadState {
public:
static MasterThreadState* State();
virtual void recieved(MasterThread& master, int tag);
private:
Init(){}
};
class Idle : MasterThreadState {
public:
static MasterThreadState* State();
virtual void recieved(MasterThread& master,int tag);
private:
static Idle instance;
};
如果在 Init 声明之后移动 MasterThread 构造函数,代码将编译(并构建):
class MasterThread
{
public:
MasterThread();
void handle(int sender, int tag);
private:
int _sender;
MasterThreadState* _state;
private:
friend class MasterThreadState;
void goTo(MasterThreadState* newState){ _state = newState; }
};
class MasterThreadState
{
public:
virtual void recieved(MasterThread& master, int tag) {}
protected:
void goTo(MasterThread& m, MasterThreadState* newState){
m.goTo(newState);
}
};
class Init : MasterThreadState {
public:
static MasterThreadState* State() { return &instance; }
virtual void recieved(MasterThread& master, int tag) {}
private:
static Init instance;
};
Init Init::instance;
MasterThread::MasterThread() {
_state = Init::State();
}
注意,Init::State() 应该 return 指针,MasterThreadState*
。这也发生了变化,定义了静态成员 Init::instance,并将虚函数的实现(空)正确添加到 link。