[英]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.