如何使用 `make_shared` 创建指针

How to create pointer with `make_shared`

我正在查看此页面 http://www.bnikolic.co.uk/blog/ql-fx-option-simple.html,关于执行 shared_pointer。

有这样一行-

boost::shared_ptr<Exercise> americanExercise(new AmericanExercise(settlementDate, in.maturity));

我明白,通过这一行,我们基本上是在创建一个名称为 americanExerciseshared pointer,它指向一个 class Exercise 的对象。

但我想知道如何用 make_shared 重写这一行,因为人们认为 make_shared 是定义指针​​的更有效方法。下面是我的尝试 -

shared_ptr<Exercise> americanExercise = make_shared<Exercise>(AmericanExercise(settlementDate, in.maturity)); 

然而,这失败并出现错误 -

error: use of undeclared identifier 'make_shared'
     shared_ptr<Exercise> americanExercise = make_shared<Exercise>(AmericanExercise(settlementDate, in.maturity));

在这种情况下,您能否帮助我理解 make_shared 的用法。

非常感谢您的帮助。

您似乎缺少第二个示例中的名称空间。您也可以在 make_shared.

中构建派生类型
boost::shared_ptr<Exercise> americanExercise = boost::make_shared<AmericanExercise>(settlementDate, in.maturity); 

除了@Caleth 的有效答案还有两点:

基础 class 与派生 class

使用 make_shared 创建指针时,您必须使用实际派生的 class 并为该 class 的构造函数传递参数。它不知道 base-class 与 derived-class 的关系。您可以通过赋值将其用作指向基 class 的共享指针(您会注意到,这是指向不同的共享指针类型)。

考虑使用标准库。

一个make_shared()函数和一个共享指针class在C++14之后的标准库中可用,所以你可以这样写:

#include <memory>

// ...

std::shared_ptr<Exercise> americanExercise = 
   std::make_shared<AmericanExercise>(settlementDate, in.maturity); 

到目前为止,standard-library 共享指针更为常见,因此如果您打算将它们传递给其他人编写的代码,您可能应该更喜欢它们。当然,如果你广泛使用 Boost,那也没关系。