第一次在 Stackoverflow!我是 C++ 和 OOP 的新手,目前在尝试用 C++ 设计 StateChart 时遇到问题。
我找到了一些解释如何创建具有 n 状态的状态机的文档,以及一个模拟红绿灯中红-绿-黄转换的代码示例。
我报告以下代码:
标题
class TLState
{
public:
virtual void Handle() = 0;
};
class TLNetTraffic
{
private:
TLState* _state;
public:
TLNetTraffic();
void setState ( TLState* state );
void Handle();
};
class TLRed: public myTLState
{
private:
TLNetTraffic* _context;
public:
TLRed(TLNetTraffic* context);
void Handle();
};
class TLGreen: public TLState
{
private:
TLNetTraffic* _context;
public:
TLGreen(TLNetTraffic* context);
void Handle();
};
class TLYellow: public TLState
{
private:
TLNetTraffic* _context;
public:
TLYellow(TLNetTraffic* context);
void Handle();
};
cpp
#include "classes.h"
#include <iostream>
TLNetTraffic::TLNetTraffic()
{
_state = new TLRed(this);
}
void TLNetTraffic::setState ( TLState* state )
{
_state = state;
}
void TLNetTraffic::Handle ()
{
_state->Handle();
}
TLRed::TLRed(TLNetTraffic* context): _context(context) {}
void TLRed::Handle()
{
std::cout << "Red Light" << std::endl;
_context->setState( new TLGreen(_context) );
}
TLGreen::TLGreen(TLNetTraffic* context): _context(context) {}
void TLGreen::Handle()
{
std::cout << "Green Light" << std::endl;
_context->setState( new TLYellow(_context) );
}
TLYellow::TLYellow(TLNetTraffic* context): _context(context) {}
void TLYellow::Handle()
{
std::cout << "Yellow Light" << std::endl;
_context->setState( new TLRed(_context) );
}
我的问题是:我想用每个上层状态的子状态来扩展这个例子,例如 Red_1、Red_2、Red_3、Green_1、Green_2、Green_3、Yellow_1、Yellow_2、Yellow_3 ......
现在,我想到的最简单的事情是“考虑”同一级别的所有状态并使用上面报告的结构。就个人而言,我不喜欢这个解决方案,我想知道是否可以实现更好的设计。我尝试修改代码如下(我只报告“红色”类):
class myTLState
{
public:
virtual void Handle() = 0;
};
class myTLState_internal //NEW VIRTUAL CLASS
{
public:
virtual void Handle() = 0;
};
class myTLNetTraffic
{
private:
myTLState* _state;
public:
myTLNetTraffic();
void setState ( myTLState* state );
void Handle();
};
class myTLRed: public myTLState
{
private:
myTLNetTraffic* _context;
myTLState_internal* _internal_state; //NEW POINTER TO THE NEW VIRTUAL CLASS
public:
myTLRed(myTLNetTraffic* context);
void Handle();
void setState ( myTLState_internal* _internal_state );
};
class myTLRed_internal1: public myTLState_internal
{
private:
myTLRed* _internal_context;
public:
myTLRed_internal1(myTLRed* context);
void Handle();
};
class myTLRed_internal2: public myTLState_internal
{
private:
myTLRed* _internal_context;
public:
myTLRed_internal2(myTLRed* context);
void Handle();
};
我在cpp中添加了以下内容:
myTLRed::myTLRed(myTLNetTraffic* context): _context(context)
{
_internal_state = new myTLRed_internal1(this);
}
myTLRed_internal1::myTLRed_internal1(myTLRed* context): _internal_context(context){}
我收到以下错误消息: undefined reference to 'vtable for myTLRed_internal1'
老实说,不知道那是什么,也不知道这是否是正确的方法。任何帮助将非常感激。非常感谢,很抱歉这么长的帖子。
对所有指出存在大量内存泄漏的人进行编辑:您是完全正确的,我知道这一点,但为了简单起见,只报告了我找到的代码。避免内存泄漏的下一个改进是使用智能指针,这是我的计划。