我有一个GenericRoot类,该类具有许多从其衍生的类。我只想创建此类的单个实例。我对here看到的这种方法很熟悉:
class genericRoot {
private:
genericRoot() {}
public:
static genericRoot &getInstance ();
};
class Handler : public genericRoot {
}
但是,这导致每个Handler(以及从Generic Root派生的每个其他类)得到两个错误:
“错误:在这种情况下”
“错误:genericRoot :: genericRoot是私有的”
有没有一种干净的方法来实现这一目标?
答案 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 {
};
但是,我同意其他答案,您应该仔细考虑为什么/是否真的需要单例类的子类,因为这很奇怪。