我正在编写一个程序,该程序从数据库读取文档并将内容转换为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;
}

10-07 19:28