我正在编写一个程序,它从数据库中读取文档并将内容转换为C ++类实例化。在每个文档中都有一个"类型"我正在映射到特定C ++类的字段。基本上我读了文档,构造了相应类的对象,并填写了类对象的字段。我可能有10-15种不同类型的类,因为每个文档中的数据类型可能不同,尽管某些类型是常见的。常见的数据类型反映在基类/派生类定义中。现在我有一个switch语句,case语句对应不同类型的对象,在每种情况下语句我创建了正确类型的对象然后填入它。虽然它有点乱。
我想知道是否有办法将各种类定义放在一个数组中,以便我可以大部分摆脱switch语句。我理想的代码如下:
auto * obj = new arrayOfClassDefinitions [typeofClassIndex]
其中arrayOfClassDefinitions包含一组类的名称。然后obj指针指向所需类的新实例化。
我记得我可以在Python中做这样的事情,但我不确定C ++。
任何想法??
答案 0 :(得分:1)
如果您可以将所有类组织到一个分层树中,则可以使用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;
}