我正在编写一个程序,该程序从数据库读取文档并将内容转换为C ++类实例化。在每个文档中,都有一个“类型”字段,我正在映射到特定的C ++类。基本上,我阅读了文档,构造了相应类的对象,并填写了类对象的字段。我可能有10-15种不同类型的类,因为每个文档中的数据类型可能不同,尽管某些类型是常见的。数据的常见类型反映在基类/派生类定义中。现在,我有一个switch语句,其中的case语句对应于不同类型的对象,在每种情况下,我都创建正确的对象,然后将其填充。但这有点混乱。
我想知道是否有一种方法可以将各种类定义放在数组中,这样我就可以摆脱switch语句。我理想的代码如下所示:
自动* obj =新的arrayOfClassDefinitions [typeofClassIndex]
其中arrayOfClassDefinitions包含一组类的名称。然后,obj指针将指向所需类的新实例。
我记得我可以在Python中做类似的事情,但是我不确定C ++。
有任何想法吗??
最佳答案
如果可以将所有类组织到一个层次树中,则可以使用Abstract factory pattern获得类似的结果。这是示例:
#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;
}