Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将构造函数作为回调参数或返回值传递_C++_Constructor_Callback - Fatal编程技术网

C++ 将构造函数作为回调参数或返回值传递

C++ 将构造函数作为回调参数或返回值传递,c++,constructor,callback,C++,Constructor,Callback,基本上,我要做的是制造一流的工厂: class SomeClass { // Returns subclass of SomeClass by given name, or nullptr static SomeClass* childFromString(const std::string&); } 我将使用if…else查找实际的子类,其中大约有5个。但为了推迟安装,我想返回构造函数而不是引用: class SomeClass { // This is an

基本上,我要做的是制造一流的工厂:

class SomeClass {
    // Returns subclass of SomeClass by given name, or nullptr
    static SomeClass* childFromString(const std::string&);
}
我将使用
if…else
查找实际的子类,其中大约有5个。但为了推迟安装,我想返回构造函数而不是引用:

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中是合法的。我不认为它需要反射才能工作,构造函数只是一个函数,对吗


所以再一次,如何将构造函数函数作为参数或返回值传递?

由于

构造函数没有名称


您可以在函数中构造对象,也可以返回指向某个创建者的函数指针。

来自C++98标准12.1/12构造函数:

不得使用建造商的地址


构造函数不是“正确”的函数。注意:同样的情况适用于析构函数。

,不能将函数指针传递给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();
}
struct-ChildInterface{
//你的界面在这里
virtual~Interface()=默认值;
};
结构Paul:公共接口{
//接口的实现
};
std::函数getDeferedFactoryFor(const std::string和child)
{
如果(孩子=“保罗”){
返回[](){
返回新的Paul();
};
}
如果(儿童=“卡拉”){
返回[](){
返回新的Kara();
};
}
//这里有更多的孩子
//错误处理
返回[](){
返回空ptr;
}
}
//用法示例
void createChild()
{
auto childCreator=getDeferedFactoryFor(“保罗”);
ChildInterface*paul=childCreator();
paul->doSomeThing();
}

请注意,如果不这样做,有很多方法可以解决我的问题,但我很好奇这是否可行以及如何实现。我很好奇构造器是如何工作的,这看起来是一个很好的练习,可以了解更多。你不能传递或直接调用构造器。构造器没有名字。谢谢,我总有一天会使用它,太好了!:)