基本上我要做的就是上课:
class SomeClass {
// Returns subclass of SomeClass by given name, or nullptr
static SomeClass* childFromString(const std::string&);
}
我将使用if...else
来查找实际的子类,其中有5个。但是为了推迟实例化,我想返回构造函数而不是refference:
class SomeClass {
// This is an attempt to define "returns constructor of SomeClass"
static (SomeClass)(int) childFromString(const std::string&);
}
将用作:
SomeClass* = new (SomeClass::childFromString("Child"))(someNumber);
这在C ++中看起来很奇怪,但在javascript或Java中是合法的。而且我认为它不需要反射才能工作,构造函数只是一个函数,对吧?
再一次,如何将构造函数函数作为参数传递或返回值?
答案 0 :(得分:2)
由于
,无法调用构造函数,或返回构造函数或对其执行某些操作构造函数没有名称。
你可以在函数中构造对象,或者向某个创建者返回一些函数指针。
答案 1 :(得分:2)
从C ++ 98 Standard 12.1 / 12构造函数:
不得采用构造函数的地址。
构造函数不是“正确”的函数。请注意,这同样适用于析构函数。
答案 2 :(得分:1)
您无法在C ++中将函数指针传递给构造函数。一种意识形态的方法是返回一个延迟构造的std ::函数:
struct ChildInterface {
// your interface here
virtual ~Interface() = default;
};
struct Paul : public Interface {
// implementation of interface
};
std::function<Interface*()> getDeferedFactoryFor(const std::string& child)
{
if (child == "paul") {
return []() {
return new Paul();
};
}
if (child == "kara") {
return []() {
return new Kara();
};
}
// more children here
// error handling
return []() {
return nullptr;
}
}
// usage example
void createChild()
{
auto childCreator = getDeferedFactoryFor("paul");
ChildInterface * paul = childCreator();
paul->doSomeThing();
}