动态创建作为默认函数参数传递的派生类对象的最佳和最安全的方法是什么?

Adv*_*ent -1 c++ smart-pointers default-arguments

我有一堂课

class Base {
public:
    virtual ~Base() {}
    virtual string returnString() = 0;
};

class B : public A {
public:
     string returnString() { return "string"; }
}

class C : public A {
public:
     string returnString() { return ""; }
}
Run Code Online (Sandbox Code Playgroud)

和功能

string returnStringFunction(...);
Run Code Online (Sandbox Code Playgroud)

我希望能够传递 C 类型的对象,但默认情况下,我希望此函数使用动态创建的 B 类型对象。

我记得使用过这样的东西:

string returnStringFunction(const A& a = *std::make_unique<B>()) 
Run Code Online (Sandbox Code Playgroud)

或者

string returnStringFunction(const std::unique_ptr<A> a = std::make_unique<B>()) 
Run Code Online (Sandbox Code Playgroud)

函数体示例:

string returnStringFunction(...) {
    return a->returnString();
}
Run Code Online (Sandbox Code Playgroud)

但是这两个解决方案即使它们通常在我的“沙盒”环境中编译和工作,它们也会在工作区上生成SIGFAULT。知道是什么原因造成的或如何更好地解决它吗?

提前致谢

for*_*818 5

正如评论中提到的,const std::unique_ptr<A> a = std::make_unique<B>()应该没问题,而另一个则不然。然而,一般来说,默认参数在 C++ 中只是二等公民。如果没有什么反对的话,我宁愿重载该函数。

如果您希望函数可以带或不带参数调用,您可以提供两个重载:

string returnStringFunction(const Base&);
string returnStringFunction() {
     B b;
     returnStringFunction(b);
}
Run Code Online (Sandbox Code Playgroud)

不知道为什么你会在这里动态分配B,但如果你愿意的话可以。

  • 深入研究默认参数:这些参数在**调用站点**使用。对于大型项目,对默认参数的任何更改都需要重建所有受影响的调用方。使用重载函数方法,更改 *thunk* 重载只需要重建一个文件。 (2认同)