【问题标题】:What are the drawbacks if the Singleton constructor is made protected - Inheritance - C++11?如果 Singleton 构造函数被保护 - 继承 - C++11,有什么缺点?
【发布时间】:2014-11-21 16:42:43
【问题描述】:

我希望类继承单例类。因此,我需要使构造函数受保护而不是私有。另外,我知道静态方法不能被覆盖,因为静态是类成员。现在,问题是如果我让构造函数受到保护,会有什么问题吗?单例场景中受保护的构造函数有缺点吗?我说的是C++的参考。

【问题讨论】:

标签: c++ c++11 singleton


【解决方案1】:

我不认为让构造函数受保护有任何缺点。受保护的访问说明符旨在用于继承。
如果您不保护基类构造函数,您将如何创建派生类对象?

下面是一个简单的实现。

class Base {
public:
    static Base* getInstance() {
        if(Base::_instance == NULL)
            Base::_instance = new Base(); 
        return Base::_instance;
     }
protected:
    Base() {}
private:
    static Base* _instance;
};

在 .cpp 文件中:

Base::_instance = NULL;



class Derived : public Base {
public:
    static Derived* getInstance() { 
        if(instance == NULL)
            _instance = new Derived;
        return _instance;
    }
private:
    static Derived* _instance;
};

【讨论】:

  • 这不是单例,而是内存泄漏工厂。
  • @MikeSeymour 你是对的,但这有点苛刻。只需编辑它。
  • 内存泄漏是怎么回事?
  • @Rush 你必须有一个静态成员指针。当您创建实例时,您会影响指针。在 getInstance() 方法中,您需要检查指针是否为 NULL。如果指针为 NULL,则没有实例,您必须创建它,如果它不为 null,则返回指针。
  • @Rush:每次调用getInstance() 都会创建一个新实例,让用户负责删除它。用户被告知它是一个单例,不会想删除它,所以它会被泄露。
【解决方案2】:

简短回答:不要。 您可能有充分的理由使用单例(不太可能,但到底是什么)。 我几乎不认为你有充分的理由让一个单例派生自另一个单例。

这完全没用。当您创建Derived 的实例时,您将创建Base 的实例。

只需将Derived 设为单例,将Base 设为具有公共构造函数的标准类即可。

Singleton 设计模式是指创建类实例的接口。这仅意味着您将要实例化的具体类。不是潜在的抽象基类。

【讨论】:

    【解决方案3】:

    我认为其他一些帖子误解了 OP 的意思,所以我只给我两分钱 :)。我认为 OP 正在谈论如下结构:

    template<class A>
    class Singleton // class that defines what is means to be Singleton
    {
       private:
    
       protected:
          Singleton() = default;
    
       public:
          static A& instance()
          {
             static A a;
             return a;
          }
    };
    
    class DerivedSingleton: public Singleton<DerivedSingleton> // Make concrete Singleton
    {
       friend Singleton<DerivedSingleton>;
       private:
          DerivedSingleton();
       public:
          void DerivedMethod();
    };
    
    // .. some code ...
    DerivedSingleton::instance().DerivedMethod(); // call method
    

    在这种情况下,我没有看到任何问题与创建 Singleton 构造函数 protected。获取DerivedSingleton 的唯一方法是通过Singleton 类的instance 函数。 Singleton 是否是一个好的设计模式我没有意见。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-21
      • 2013-08-27
      • 2013-12-24
      • 2019-08-24
      • 2017-08-05
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      相关资源
      最近更新 更多