假设我有3个类,ClassA,ClassB,ClassC,所有这些都继承自classD,并且所有这些都有Constructor只获得一个int,我想构建一个函数来获取字符串中的类名和一些int ,并从类名返回新对象, 是否可以不用c ++中的条件检查类名?
我不想做那样的事情
if(className == "classA")
return new ClassA(Num)
else if(className == "classB")
return new Classb(Num) ....
答案 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个)。