簡體   English   中英

使用A類類型的shared_ptr作為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) };
  1. 如果我輸入錯誤或者我在概念上誤解了某些東西(或任何其他解釋),我將不勝感激
  2. 一般來說,我們為什么要使用make_shared? 還有哪些其他方法,它們的優缺點是什么? 其實我不明白如果private: std::shared_ptr < class A > sp; 我已經通過調用 A 類的默認構造函數創建了對象? 所以通過 make_shared 我正在創建另一個對象?
  3. 我如何使用構造函數初始化器列表:? PS根據下面的一個答案,似乎我不能使用初始化列表方法。 因為我為 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_ptr make_shared異常安全的 它使用相同的調用為控制塊和資源分配內存,從而減少了構造開銷。 如果不使用make_shared ,則必須使用顯式new表達式來創建對象,然后再將其傳遞給shared_ptr構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM