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

Why/How does the mechanism that cleans up statics, gain access rights that allow it to call private members?

本文关键字:许它 调用 成员 权限 访问权 机制 静态 为什么 访问 何获得      更新时间:2023-10-16

我测试了一个在c++中声明单例类的模式,该模式使默认的析构函数为'private',但该模式不通过任何成员调用使用该析构函数。

我在Ubuntu QQ上使用gnu g++编译器测试了这段代码-析构函数在程序终止时被调用,尽管指定为"private"。

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

注意:我来自Delphi/Object Pascal世界,ObjectPascal不支持静态类声明——尽管有几种方法可以创建单例。根据我的经验,'private'('strict private'…)是 private 。在c++中,

解释吗?

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

经典示例:

class S
{
    public:
        // This is a member function so can access the constructor of S
        static S& getInstance()
        {
            static S    instance;
            return instance;
        }
    private:
        S() {};
        S(S const&);
        void operator=(S const&);
};

(OP后编辑编辑)

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

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

 MyClass.getInstance().~MyClass();

静态存储对象的析构函数被调用作为从main()返回或调用exit()的结果。

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

Singleton *Singleton::instance();

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

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

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()来访问和删除单例对象

相关文章: