假设我的类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) };
- 如果我有打字错误,或者如果我在概念上误解了某些东西(或任何其他解释),我将非常感谢纠正我 一般来说,我们为什么要使用make_shared?其他的方法是什么?它们的优缺点是什么?实际上,我不明白如果通过
- 如何使用构造函数初始化列表?附注:根据下面的一个答案,我似乎不能使用初始化列表方法。因为我写的关于a1和b2的简单计算只是为了展示我的问题。我的实际计算时间比这长,我认为我不能使用
B (double d,double e): sp{std::make_shared<A>(d*2, e*2)}
这样的方法。
private: std::shared_ptr < class A > sp;
,我已经通过调用类A的默认构造函数创建了对象?通过make_shared,我创建了另一个对象?如何使用构造函数初始化列表:
如果你想初始化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
构造函数的参数列表。
本例中模板形参T
是A
,因此std::make_shared
被用来构造std::shared_ptr<A>
,并在构造函数初始化列表中用它初始化sp
。
sp
.
从如何创建和使用shared_ptr
实例:
在首次创建内存资源时,尽可能使用
make_shared
函数创建shared_ptr
。make_shared
是异常安全的. 它使用相同的调用为控制块和资源分配内存,从而减少了构造开销。如果不使用make_shared
,那么在将对象传递给shared_ptr
构造函数之前,必须使用显式的new
表达式来创建对象。