![](/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.