簡體   English   中英

boost :: shared_ptr-兩個類之間的組合關系

[英]boost::shared_ptr - composition relation between two classes

假設我有:

  • 兩類:P和C。
  • P <>-C之間的組合關系,即P的每個實例都包含一個C的實例,當父P實例被銷毀時,該實例也被銷毀。

為了實現這一點,在C ++ I中:

  • 定義兩個類別P和C;
  • 定義類型為boost :: shared_ptr的P的成員變量,並使用P的構造函數中新創建的對象對其進行初始化。

下面給出一個代碼示例。

    #include "boost/scoped_ptr.hpp"

    class C
    {
      public:
        C() {}

      private:

    };

    class P
    {
      public:
        P() : childC(new C()) {}

      private:
        boost::shared_ptr<C> childC;
    };

    int main(int argc, char** argv)
    {
        P p;
    }

不知何故,我無法構建這個簡單的代碼示例,並且我不明白為什么(我是編程的新手)。

錯誤:

類“ P”沒有任何名為“ childC”的字段

預期的';' 在“ <”令牌之前

無效使用'::'

ISO C ++禁止聲明無類型的“ shared_ptr”

造成錯誤的最可能原因是您包含了boost/scoped_ptr.hpp ,並且試圖聲明一個boost::shared_ptr 這里不太可能需要boost::shared_ptr

在這種情況下,表達成分的最簡單方法是

class C {};
class P 
{
 private:
  C c_;
};

現在,您可能希望通過使用僅要求C的前向聲明的慣用法來減少編譯時的依賴性,在這種情況下P的標頭可能是

#include <boost/scoped_ptr.hpp>

class C; // forward declaration

class P
{
 public:
  P() : c_(new C()) {}
 private:
  boost::scoped_ptr<C> c_;
};

正如KerrekSB在注釋中所暗示的那樣,您使用了shared_ptr ,但包含了scoped_ptr 區別在於, scoped_ptr表示排他所有權(此處是這種情況),而shared_ptr表示共享所有權(並非如此)。 首選的慣用法是在代碼中使用scoped_ptr

如果您絕對要使用shared_ptr,請包含標題<boost/smart_ptr/shared_ptr.hpp>

暫無
暫無

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

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