背景
最近在实现基础的状态机逻辑,考虑到需要工厂来创建一个指定的状态机,而且调用要简单且可扩展,就想到了反射机制。
以前学习了文章:
https://blog.csdn.net/Scythe666/article/details/51718864
给的思路是通过定义回调函数指针类型的方法来实现的,也就是说反射出的对象需要显式地实现实例类创建的回调函数,然后在全局注册进去,虽然步骤已经很简单了,而且一个宏就搞定注册了。
不过我想要在扩展一个需反射对象时,对外暴露的“注册行为”更少,尽量减少一个对象实现时需要考虑过多的附带代码(毕竟拷贝多了很容易出错);另一个想法就是希望在用户调用注册时,不必在全局中实现,能够在任何地方的代码块中注册。
说到这里,充分考虑C++的各种支持,无疑多态跑不掉,毕竟有工厂的概念,不过为了能够把Create这个步骤交给内部处理,模板就发挥了它的效用了,也就是说,我只需要传类型进去,就可以实现注册了。
达到效果
在介绍实现之前,先放一个最终效果,也就是从用户扩展的角度,如何达到注册+创建的需求。
#include <stdlib.h>
#include <iostream>
#include <QApplication>
#include "../../FSMBase/Include/IStateBase.h"
#include "../../FSMBase/Include/FSMObjectCreator.h"
// IStateBase 就是我需要反射创建对象的基类
// CStateIDEL和CStateIDELNew是我测试扩展的子类对象,实现了两个
class CStateIDEL : public IStateBase
{
ISTATEBASE_META_OBJECT("CStateIDEL")
public:
CStateIDEL() {
}
virtual ~CStateIDEL() {
}
/*先省略一些与反射机制无关的接口实现*/
public:
std::string m_strName;
};
class CStateIDELNew : public IStateBase
{
ISTATEBASE_META_OBJECT("CStateIDELNew")
public:
CStateIDELNew() {
}
virtual ~CStateIDELNew() {
}
/*先省略一些与反射机制无关的接口实现*/
public:
std::string m_strName;
};
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
CFSMObjectCreator* pCreator = CFSMObjectCreatorSingleton::GetInstance();
pCreator->RegisterStateBaseType<CStateIDEL>(); // 注册扩展的 CStateIDEL类
pCreator->RegisterStateBaseType<CStateIDELNew>(); // 注册扩展的 CStateIDELNew类
CStateIDEL* pIDEL = dynamic_cast<CStateIDEL*>(pCreator->CreateStateBase("CStateIDEL", "111")); // 创建 CStateIDE

本文介绍了如何在C++中利用模板和反射机制实现一个简单易扩展的状态机工厂。通过定义宏ISTATEBASE_META_OBJECT,使得类在注册时只需关注这一宏,减少了额外代码。工厂类CFSMObjectCreator使用模板方法注册和注销对象,并通过单例模式提供全局访问。创建对象时,工厂会根据类名动态创建实例。

7015

被折叠的 条评论
为什么被折叠?



