使用ClassA类型的shared_ptr作为classB的成员变量

using shared_ptr of a type of Class A as a member variable of class B

假设我的 class B 是这样的:

class B {
B (double d,double e)
private:
std::shared_ptr < class A > sp;
}

来自class A 的构造函数看起来像:

A(double a, double b){...};

现在,我想为我的 class B 编写构造函数,其中使用上面编写的构造函数构造(初始化或分配)来自 class A 的对象。有人可以向我解释我怎样才能专业地做到这一点吗?我尝试了类似下面的方法,但我得到了诸如“term does not evaluate to a function taking 1 argument”和“an initializer list is unexpected in this context”之类的错误...

class B (double d, double e){
double a1 = d*2;
double b2=  e*2;
sp { std::make_shared<class A>(a1,b2) };
  1. 如果我输入错误或者我在概念上误解了某些内容(或任何其他解释),我很乐意纠正我
  2. 一般来说,为什么要用make_shared?还有哪些其他方法,它们的优缺点是什么?实际上我不明白如果 private: std::shared_ptr < class A > sp; 我已经通过调用 class A 的默认构造函数创建了对象?所以 make_shared 我正在创建另一个对象?
  3. 如何使用构造函数启动器列表:? P.S 根据下面的一个答案,我似乎无法使用初始化列表方法。因为我为 a1 和 b2 编写的简单计算只是为了显示我的问题。我的实际计算比那个长,我想我不能使用像 B (double d,double e): sp{std::make_shared<A>(d*2, e*2)} .
  4. 这样的方法

谢谢

How can i use the constructor initilizer list using :

如果你想初始化 sp 你可以在 构造函数初始化列表 中进行,如下所示,(而不是像你一样在构造函数体内做):

//---------------------vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv-->constructor initializer list
B (double d,double e): sp{std::make_shared<A>(d*2, e*2)}
  {
      
  }

来自 std::make_shared's documentation:

template< class T, class... Args > shared_ptr<T> make_shared( Args&&... args );

std::make_shared 用于构造一个 T 类型的对象,并将其包装在一个 std::shared_ptr 中,使用 args 作为 [=14] 的构造函数的参数列表=].

(引用结束)


本例中的模板参数TA,因此std::make_shared用于构造一个std::shared_ptr<A>并用它初始化sp构造函数初始化列表。

注意我们也可以使用in-class初始化器来初始化sp.

来自 How to create and use shared_ptr instance:

Whenever possible, use the make_shared function to create a shared_ptr when the memory resource is created for the first time. make_shared is exception-safe. It uses the same call to allocate the memory for the control block and the resource, which reduces the construction overhead. If you don't use make_shared, then you have to use an explicit new expression to create the object before you pass it to the shared_ptr constructor.