通过字符串创建新对象,在c ++中重复出现类名

时间:2015-10-19 14:22:27

标签: c++

假设我有3个类,ClassA,ClassB,ClassC,所有这些都继承自classD,并且所有这些都有Constructor只获得一个int,我想构建一个函数来获取字符串中的类名和一些int ,并从类名返回新对象, 是否可以不用c ++中的条件检查类名?

我不想做那样的事情

if(className == "classA")
 return new ClassA(Num)
else if(className == "classB")
 return new Classb(Num) ....

2 个答案:

答案 0 :(得分:1)

一般来说,如果你想做类似

的事情
Base * createObject(string name)
{
    return new <name_as_a_type>();
}

你需要一种带反射的语言,所以在C ++中是不可能的,但有可能在例如ruby中。如果你特别讨厌仇恨if条件,你可以用c ++做一些奇怪的事情,虽然我不知道你为什么要这样做:

class Base
{
public:
    Base(int v)
    {
        std::cout << "base" << v << std::endl;
    }
};

class Derived : public Base
{
public:
    Derived(int v)
        : Base(v)
    {
        std::cout << "derived" << v << std::endl;
    }
};

class BaseFactory
{
public:
    virtual Base * create(int value)
    {
        return new Base(value);
    }
};

class DerivedFactory : public BaseFactory
{
    Base * create(int value) override
    {
        return new Derived(value);
    }
};

Base * createAwesomeness(string className, int parameter)
{
    static std::map<string, BaseFactory *> _map = {
        {"Base", new BaseFactory()},
        {"Derived", new DerivedFactory()}
    };
    auto it = _map.find(className);
    if(it != _map.end())
        return it->second->create(parameter);
    return nullptr;
}

int main()
{
    auto b = createAwesomeness("Base", 0); //will construct a Base object
    auto d = createAwesomeness("Derived", 1); //will construct a Derived object
    return 0;
}

答案 1 :(得分:1)

关注@SingerOfTheFall所说的内容:

您想要实施工厂设计模式。如果您进行谷歌浏览,有很多选择:

有些人有一个输入,如你所知,但其他人提供了根据需要添加你自己的工厂的能力(上面列表中的最后2个)。

对于实现工厂的Qt库,请查看Factories中的Qtilities