如何创建基类的单个实例

时间:2018-11-28 00:01:53

标签: c++ constructor singleton

我有一个GenericRoot类,该类具有许多从其衍生的类。我只想创建此类的单个实例。我对here看到的这种方法很熟悉:

    class genericRoot {
    private:
        genericRoot() {}

    public:
        static genericRoot &getInstance ();
    };

class Handler : public genericRoot {
}

但是,这导致每个Handler(以及从Generic Root派生的每个其他类)得到两个错误:

  

“错误:在这种情况下”

     

“错误:genericRoot :: genericRoot是私有的”

有没有一种干净的方法来实现这一目标?

3 个答案:

答案 0 :(得分:1)

  

有没有一种干净的方法来实现这一目标?

好的。将genericRoot的默认构造函数设为protected成员函数。

class genericRoot {
  protected:
    genericRoot() {}

  public:
    static genericRoot &getInstance ();
};

话虽如此,我想警告您,听起来对基类的对象的需求听起来不正确。这是某处设计缺陷的征兆。仔细考虑一下您的需求,并弄清楚是否有任何方法可以在不创建基类实例的情况下满足需求。

答案 1 :(得分:1)

最简单的答案是,不会。将genericRoot构造函数设为私有的目的是为了防止在getInstance工厂方法之外的任何地方创建其实例。当创建genericRoot子类的实例时,也将隐式创建genericRoot的实例。 (实际上,新对象 genericRoot构造函数正在运行时的genericRoot。)

因此,设计需要重新考虑一下。我想这里的想法是让所有子类共享一些共同的状态。如果是这种情况,那么某些私有静态状态可能比单例模式更有意义。像这样:

class genericRoot
{
private:
  static SomeType private_state_;
protected:
  // whatever state accessors are needed for subclasses...
};

代替genericRoot的构造函数,您只需在相应的cpp文件内初始化私有状态:

SomeType genericRoot::private_state_ = InitializePrivateState();

答案 2 :(得分:1)

如果在保留genericRoot的构造函数私有的同时确实需要构造genericRoot的子类,则可以将每个子类声明为friend,如下:

class genericRoot {
private:
    genericRoot() {}
    friend class Handler;

public:
    static genericRoot &getInstance();
};

class Handler : public genericRoot {
};

但是,我同意其他答案,您应该仔细考虑为什么/是否真的需要单例类的子类,因为这很奇怪。