Экземпляр синглтона и scoped_ptr - PullRequest
0 голосов
/ 25 января 2012

У меня есть синглтон со следующей структурой:

// Hpp
class Root : public boost::noncopyable
{
    public:
        ~Root();

        static Root &Get();

        void Initialize();
        void Deinitialize();

    private:
        Root();  // Private for singleton purposes
        static boost::scoped_ptr<Root> mInstance;

        Manager1 *mManager1;
        Manager2 *mManager2;
};


// Cpp
boost::scoped_ptr<Root> Root::mInstance;

Root::Root()
{
    // [!!!]
    mInstance = this;

    // Managers are using `mInstance` in their constructors
    mManager1 = new Manager1();
    mManager2 = new Manager2();

    mInstance->Initialize();
}

Root::~Root() { delete mManager1; delete mManager2; }

Root &Root::Get()
{
    if (mInstance == nullptr) mInstance = boost::scoped_ptr<Root>(new Root());
    return *mInstance;
}

Идея состоит в том, чтобы автоматически удалять экземпляр, когда программа существует.Посмотрите на строку, помеченную [!!!]: mInstance = this.Я должен сделать это, потому что mManager1 и mManager2 используют mInstance в своих целях в ctor.

Проблема в том, как использовать this с boost::scoped_ptr?В случае shared_ptr есть класс enable_shared_from_this от boost, который позволяет получить то, что мне нужно.Но что делать в моем случае?

1 Ответ

1 голос
/ 25 января 2012

Вы можете просто заставить конструкторы принять Root в качестве аргумента, а затем передать им this:

Root::Root() {
    mManager1 = new Manager1(this);
    mManager2 = new Manager2(this);    
    Initialize();
}

Еще одно преимущество этого заключается в том, что вы не получаете другие классытайно соединен с синглтоном.

...