使用类定义数组创建C++类

Creating C++ classes using an array of class definitions

本文关键字:创建 C++ 数组 定义      更新时间:2023-10-16

我正在编写一个程序,该程序从数据库中读取文档并将内容转换为C++类实例化。在每个文档中都有一个"类型"字段,我将其映射到特定的C++类。 基本上,我阅读文档,构造相应类的对象,并填写类对象的字段。我可能有 10-15 种不同类型的类,因为每个文档中的数据类型可能不同,尽管有些类型很常见。常见数据类型反映在基/派生类定义中。现在我有一个 switch 语句,其中包含对应于不同类型对象的 case 语句,在每个 case 语句中,我创建正确类型的对象,然后填写它。不过有点乱。

我想知道是否有办法将各种类定义放在数组中,以便我基本上可以摆脱 switch 语句。我的理想代码如下所示:

auto * obj = new arrayOfClassDefinitions[typeofClassIndex]

其中 arrayOfClassDefinition 包含一组类的名称。然后,obj 指针将指向所需类的新实例化。

我记得我可以在 Python 中做这样的事情,但我不确定C++。

任何想法??

如果可以将所有类组织到一个分层树中,则可以使用抽象工厂模式来获得类似的结果。这是一个例子:

#include <map>
#include <memory>
class IBaseClass {
public:
virtual ~IBaseClass(){}
};
class A : public IBaseClass {
public:
// ....
};
class B : public IBaseClass {
public:
// ....
};
class C : public IBaseClass {
public:
// ....
};
class IFactory {
public:
virtual ~IFactory(){}
virtual IBaseClass* create() = 0;
};
template <class T>
class SimpleFactory :
public IFactory {
public:
IBaseClass* create() override {
return new T();
}
};
template <typename T>
std::shared_ptr<IFactory> make_factory() {
return std::make_shared<SimpleFactory<T> >();
}
int main(int, char**)
{
std::map<int, std::shared_ptr<IFactory>> factories = {
{1, make_factory<A>()},
{2, make_factory<B>()},
{3, make_factory<C>()}
};
// ....
int type_index = 1;
auto obj = factories[type_index]->create();
// ...
// don't forget to delete
delete obj;
return 0;
}