为什么/如何清理静态的机制,获得允许它调用私有成员的访问权限?

时间:2013-05-06 17:54:49

标签: c++ singleton destructor access-modifiers

我测试了一个模式,用于在C ++中声明一个单独的类,使默认的析构函数'私有',但该模式不会通过任何成员调用使用此析构函数。

我使用gnu g ++ compliler在Ubuntu QQ上测试了这段代码 - 析构函数在程序终止时被调用,虽然被指定为“私有”。

谁/什么/如何调用这个析构函数,因为它被指定为私有?

注意:我来自Delphi / Object Pascal世界,并且ObjectPascal不支持静态类声明 - 尽管有几种方法可以创建单例。根据我的经验,'私人'('严格私人'......)是私人。我在C ++中看到它并不那么。

解释吗

4 个答案:

答案 0 :(得分:4)

该对象通常由名为static的{​​{1}}成员函数实例化,然后为您提供对该对象的引用。因为它是一个成员函数,所以它可以访问构造函数。

经典例子:

getInstance

答案 1 :(得分:1)

(OP编辑后编辑)

将析构函数设为私有可以防止它被显式调用。

如果析构函数是公开的,这将是合法的:

 MyClass.getInstance().~MyClass();

静态存储对象的析构函数是从main()返回或调用exit()调用的。

答案 2 :(得分:1)

典型的单例类有一个静态成员函数,它返回一个指向单例对象的指针。例如:

Singleton *Singleton::instance();

其中instance()是静态成员函数。静态成员函数可以调用私有构造函数。

答案 3 :(得分:1)

它们是私有的,因为您不希望允许外部任何代码构造或破坏该对象。单身人士通常有一个静态实例,通过工厂方法进行初始化和删除。

tempalte <class T>
class Singleton
{
public:
    static T* GetInstance()
    {
        if(!m_sInstance)
        {
            m_sInstance = new T();
        }

        return m_sInstance;
    }

    static void DestroyInstance()
    {
        delete m_sInstance;
        m_sInstance = 0;
    }
private:
    static T* m_sInstance;    
};

class Foo : public Singleton<Foo>
{
friend class Singleton<Foo>;
private:
    Foo();
    ~Foo();
};

因此,您可以致电Foo::GetInstance()Foo::DestroyInstance()来访问和删除单件对象。