簡體   English   中英

如何在不是shared_ptr的成員中使用shared_ptr?

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

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