Singleton的实例和scoped_ptr

时间:2012-01-24 20:19:26

标签: c++ boost singleton smart-pointers

我有一个具有以下结构的单身人士:

// 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。我必须这样做是因为mManager1mManager2在ctor中使用mInstance

问题是如何将thisboost::scoped_ptr一起使用?在shared_ptr案例中,来自boost的enable_shared_from_this类允许获得我需要的内容。但在我的情况下该怎么做?

1 个答案:

答案 0 :(得分:1)

您可以让构造函数将Root作为参数,然后将this传递给它们:

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

这样做的另一个好处是你不会秘密地将其他类与单身人员联系起来。