[英]How to use shared_ptr in a member which is not a shared_ptr?
我正在研究幾個類,我想知道如何在我的應用程序類中使用普通成員,該成員需要使用shared_from_this()?
這是一些代碼來闡明我的意思(請參閱評論)
class Observable {
public:
void addObserver(boost::shared_ptr<Observer> observer) {
// add to a list
}
};
class Observer {
public:
virtual void onUpdate() = 0;
};
class MyObservableType : public Observable {
};
class ApplicationModel : public Observer {
private:
MyObservableType mot;
public:
void setup() {
// how do I pass this as a boost::shared_ptr, as ApplicationModel is not
// a boost::shared_ptr in the Application class this using a call to
// "shared_from_this()" (and inheriting public shared_from_this<ApplicationModel>
mot.addObserver([shared_from_this])
}
};
class Application {
private:
ApplicationModel model;
public:
void setup() {
model.
}
};
您有以下三種解決方案:
第一個解決方案 :通過將其構造函數設為私有來強制應用程序創建一個shared_ptr。 對於任何從enable_shared_from_this
類,我建議這樣做
class ApplicationModel : public Observer, public boost::enable_shared_from_this<ApplicationModel> {
private:
ApplicationModel(); // private constructor
MyObservableType mot;
public:
// an instance of this class can only be created using this function
static boost::shared_ptr<ApplicationModel> buildApplicationModel() {
return boost::make_shared<ApplicationModel>();
}
void setup() {
mot.addObserver(shared_from_this()) ;
}
};
第二種解決方案 :更改您的代碼設計。 您不應該要求ApplicationModel將自身注冊到Observable,而是自己進行。 這樣, ApplicationModel
不會強制執行任何操作,但是如果其所有者想要調用addObservable
,則必須創建一個shared_ptr。 這或多或少就是所謂的依賴注入 。
class Application {
private:
boost::shared_ptr<ApplicationModel> model;
MyObservableType mot;
public:
void setup() {
model = boost::make_shared<ApplicationModel>();
mot.addObserver(model);
}
};
編輯:第三個解決方案:使用虛擬的shared_ptr,如下所示:
class ApplicationModel : public Observer {
private:
boost::shared_ptr<ApplicationModel> myself;
MyObservableType mot;
public:
void setup() {
mot.addObserver(myself) ;
}
ApplicationModel() {
myself = boost::shared_ptr<ApplicationModel>(this, [](ApplicationModel*) {});
}
~ApplicationModel() {
mot.removeObserver(myself);
assert(myself.unique());
}
};
我們的想法是創建一個shared_ptr來this
並告訴shared_ptr
不調用析構函數(這里我用一個空的lambda函數,但你可以很容易地創建一個內聯結構)。 這是黑客,您不應該這樣做。
你不能 shared_from_this()
要求通過shared_ptr
動態分配對象。
請參閱文檔的此頁面 ,其中指出:
要求:enable_shared_from_this必須是T的可訪問基類。*這必須是類型T的實例t的子對象。 必須至少存在一個擁有t的shared_ptr實例p。
因此,您需要更改代碼,以使ApplicationModel
任何實例都由shared_ptr“擁有”。 例如:
class ApplicationModel :
public Observer,
public boost::enable_shared_from_this<ApplicationModel>
{
//...
void setup() {
mot.addObserver(shared_from_this());
}
};
class Application {
private:
// Application object must initialize this somewhere
boost::shared_ptr<ApplicationModel> model;
//...
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.