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

时间:2017-03-15 17:35:30

标签: c++ class

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

我想知道是否有办法将各种类定义放在一个数组中,以便我可以大部分摆脱switch语句。我理想的代码如下:

auto * obj = new arrayOfClassDefinitions [typeofClassIndex]

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

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

任何想法??

1 个答案:

答案 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;
}