使用类a的shared_ptr作为类b的成员变量



假设我的类B是这样的:

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

类A的构造函数看起来像:

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

现在,我想为我的类B编写构造函数,其中类A的对象使用上面编写的构造函数来构造(初始化或赋值)。谁能告诉我怎么才能做到专业?我尝试了下面的东西,但我得到错误,如&;术语不评估为一个函数接受1个参数&;并且&;初始化列表在此上下文中是不可预期的&;…

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;,我已经通过调用类A的默认构造函数创建了对象?通过make_shared,我创建了另一个对象?
  3. 如何使用构造函数初始化列表?附注:根据下面的一个答案,我似乎不能使用初始化列表方法。因为我写的关于a1和b2的简单计算只是为了展示我的问题。我的实际计算时间比这长,我认为我不能使用B (double d,double e): sp{std::make_shared<A>(d*2, e*2)}这样的方法。

感谢

如何使用构造函数初始化列表:

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

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

}

来自std::make_shared的文档:

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

std::make_shared用于构造T类型的对象,并将其包装在std::shared_ptr中,使用args作为T构造函数的参数列表。

(")

本例中模板形参TA,因此std::make_shared被用来构造std::shared_ptr<A>,并在构造函数初始化列表中用它初始化sp

注意,我们也可以使用类内初始化器初始化sp.

从如何创建和使用shared_ptr实例:

在首次创建内存资源时,尽可能使用make_shared函数创建shared_ptrmake_shared是异常安全的. 它使用相同的调用为控制块和资源分配内存,从而减少了构造开销。如果不使用make_shared,那么在将对象传递给shared_ptr构造函数之前,必须使用显式的new表达式来创建对象。

相关内容

  • 没有找到相关文章

最新更新