使用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) };
- 如果我输入错误或者我在概念上误解了某些内容(或任何其他解释),我很乐意纠正我
- 一般来说,为什么要用make_shared?还有哪些其他方法,它们的优缺点是什么?实际上我不明白如果
private: std::shared_ptr < class A > sp;
我已经通过调用 class A 的默认构造函数创建了对象?所以 make_shared 我正在创建另一个对象?
- 如何使用构造函数启动器列表:?
P.S 根据下面的一个答案,我似乎无法使用初始化列表方法。因为我为 a1 和 b2 编写的简单计算只是为了显示我的问题。我的实际计算比那个长,我想我不能使用像
B (double d,double e): sp{std::make_shared<A>(d*2, e*2)}
. 这样的方法
谢谢
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] 的构造函数的参数列表=].
(引用结束)
本例中的模板参数T
是A
,因此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.
假设我的 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) };
- 如果我输入错误或者我在概念上误解了某些内容(或任何其他解释),我很乐意纠正我
- 一般来说,为什么要用make_shared?还有哪些其他方法,它们的优缺点是什么?实际上我不明白如果
private: std::shared_ptr < class A > sp;
我已经通过调用 class A 的默认构造函数创建了对象?所以 make_shared 我正在创建另一个对象? - 如何使用构造函数启动器列表:?
P.S 根据下面的一个答案,我似乎无法使用初始化列表方法。因为我为 a1 和 b2 编写的简单计算只是为了显示我的问题。我的实际计算比那个长,我想我不能使用像
B (double d,double e): sp{std::make_shared<A>(d*2, e*2)}
. 这样的方法
谢谢
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] 的构造函数的参数列表=].
(引用结束)
本例中的模板参数T
是A
,因此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 ashared_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 usemake_shared
, then you have to use an explicitnew
expression to create the object before you pass it to theshared_ptr
constructor.