我测试了一个模式,用于在C ++中声明一个单独的类,使默认的析构函数'私有',但该模式不会通过任何成员调用使用此析构函数。
我使用gnu g ++ compliler在Ubuntu QQ上测试了这段代码 - 析构函数在程序终止时被调用,虽然被指定为“私有”。
谁/什么/如何调用这个析构函数,因为它被指定为私有?
注意:我来自Delphi / Object Pascal世界,并且ObjectPascal不支持静态类声明 - 尽管有几种方法可以创建单例。根据我的经验,'私人'('严格私人'......)是私人。我在C ++中看到它并不那么。
解释吗
答案 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()
来访问和删除单件对象。