![](/img/trans.png)
[英]Initializing a member with type std::shared_ptr<B> of a class A with a pointer to class B in a member function of B
[英]using shared_ptr of a type of Class A as a member variable of class 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) };
private: std::shared_ptr < class A > sp;
我已经通过调用 A 类的默认构造函数创建了对象? 所以通过 make_shared 我正在创建另一个对象?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)}
{
}
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
。
首次创建内存资源时,尽可能使用
make_shared
函数创建shared_ptr
。make_shared
是异常安全的。 它使用相同的调用为控制块和资源分配内存,从而减少了构造开销。 如果不使用make_shared
,则必须使用显式new
表达式来创建对象,然后再将其传递给shared_ptr
构造函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.