2013-05-06 43 views
3

我测试了一种模式来声明C++中的单例类,它使默认的析构函数'私有',但是该模式不通过任何成员调用来使用这个析构函数。为什么/清理静态的机制如何获得访问权限以允许其调用私人成员?

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

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

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

说明?

+0

可能重复[如何调用静态对象的私有析构函数?](http://stackoverflow.com/questions/11524131/how-are-the-private-destructors-of-static-objects-called) – 2013-05-06 21:08:55

回答

1

(OP编辑后编辑)

使析构函数私人防止它被显式调用。

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

MyClass.getInstance().~MyClass(); 

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

+0

@Mikey - 新的问题在上面回答。 – 2013-05-06 19:16:44

+0

查看新问题标题并编辑... :-)我想我没有把我的问题弄清楚 – Vector 2013-05-06 20:36:56

+0

您问是否应该公开。第二个问题由http:// stackoverflow解决。com/questions/11524131 /如何调用静态对象的私有析构函数。 – 2013-05-06 21:08:46

4

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

典型的例子:

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&); 
}; 
+0

明显 - 我的构造函数中的愚蠢问题 - 请参阅编辑。 – Vector 2013-05-06 19:01:43

1

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

Singleton *Singleton::instance(); 

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

+0

明显 - 我的构造函数中的愚蠢问题 - 请参阅编辑。 – Vector 2013-05-06 19:02:06

+0

如果我没有弄错,程序终止时会调用静态对象的析构函数。 – 2013-05-06 19:06:53

+0

所以我会想 - 但是什么叫它呢?如果析构函数是私有的,它不能被任何外部调用。如果默认的析构函数会被调用,那么声明它是私有的有什么意义呢?如果你在析构函数中有清理代码呢?我认为这个设计有些不对。 – Vector 2013-05-06 19:13:32

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

相关问题