簡體   English   中英

通過std :: shared_ptr強制對象

[英]enforcing objects through std::shared_ptr

我有一個設計問題。 在我的應用程序中,我要使用std::shared_ptr管理一些類。 我們要強制這些類只能由我們的std::shared_ptr創建。 因此,我們認為可以執行以下操作:

template <typename T>
class make_sharable_only
{
    make_sharable_only();
    ~make_sharable_only();

public:
    template <typename ...Args>
    static std::shared_ptr<T> CreateShareInstance(Args ...args)
    {
        std::shared_ptr<T> ptr;
        ptr.reset(new T(args...));

        return ptr;
    }

};
    class A: public make_sharable_only<A>
    {

    };

void f()
{
    auto aPtr = A::CreateShareInstance();
}

但是,問題在於,即使CreateShareInstance也無法創建A的實例。我不想創建friend關系。 有沒有為此目的定義此類基類的方法?

提前致謝。

我不想建立friend關系。

為什么不? 為什么拒絕可行的解決方案?

如果您希望其他班級對私人/受保護成員具有特殊訪問權限,則它要么需要從您的班級派生(而不是您班級的基礎),要么需要成為您班級的朋友。

我假設您打算在A擁有一個私有構造函數。

還有這個:

    std::shared_ptr<T> ptr;
    ptr.reset(new T(args...));

    return ptr;

應該:

    return make_shared<T>(std::forward<Args>(args)...);

一旦這樣寫就很簡單,沒有理由嘗試使用基類,只需將工廠函數放在A ,只需三行代碼(四行使其成為模板):

class A {
  A() = default;
public:
  static std::shared_ptr<A> create() {
    return std::make_shared<A>();
  }
};

您無法實例化shared_ptr<make_sharable_only>因為make_sharable_only::~make_sharable_only是私有的。 您可以將構造函數保留為私有狀態,而將析構函數設為公共(好吧,有人可以刪除從shared_ptr獲得的原始指針,但是偶然地做到這一點是不可能的)。

暫無
暫無

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

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