调用静态单例实例的方法调用另一个方法

时间:2013-11-17 08:50:04

标签: c++

我正在浏览一些随机代码,我发现了一些令人困惑的方法,该类是单例,

class CFoo
{
   CFoo* _instance;
   CFoo(){};

public:
   ~CFoo(){};

   static CFoo* getInstance()
   {
       if(!_instance)
         _instance = new CFoo;

       return _instance;
   }

   static void deleteInstance()
   {
       if(_instance)
           delete _instance;
   }

   // just ordinary member method.
   void FooMethod()
   {
       CFoo::getInstance()->BarMethod(); //confusing..
   }

   // just ordinary member method.
   void BarMethod()
   {
      //code here..
   }
};

CFoo* CFoo::_instance = NULL;

为什么FooMethod必须调用CFoo :: getInstance()来调用BarMethod?为什么不直接调用BarMethod()?

请告知。

2 个答案:

答案 0 :(得分:0)

如果您在CFoo::getInstance()->BarMethod()内拨打CFoo::FooMethod(),则this中的BarMethod关键字会引用CFoo::_instance

如果您在BarMethod()内拨打CFoo::FooMethod(),则this中的BarMethod关键字会引用调用FooMethod()的同一对象。

目前尚不完全清楚是否存在任何差异。一方面,您实现的唯一构造函数是private,您将该类称为 Singleton 。这支持只有CFoo 的一个实例存在的事实,即this == CFoo::_instance应始终保持在BarMethod内。另一方面,CFoo有一个公共副本构造函数,因此this == CFoo::_instance中的BarMethod可能并非总是如此。

答案 1 :(得分:0)

如果您可以创建此类的对象,则可以直接调用FooMethodBarmethod。问题是你不能这样做,因为construtor是私人的。您可以使用getInstance方法创建实例的唯一方法。并且该方法确保它只有这个类的单个对象。

这就是为什么它叫单身。