我有一个系统类,可以返回指向编辑器类的指针。 编辑器类在系统类中实例化,并传递指向系统的私有变量的指针。 编辑器类本质上是系统的内部数据结构的替代接口。
我的问题: 是否存在允许我禁止直接实例化编辑器类的设计模式,但仍以某种方式在系统中实例化它?
感谢。
答案 0 :(得分:6)
您可以将Editor的构造函数设为私有,这样可以阻止其他人实例化它,然后让System成为朋友将允许它访问构造函数。
class System {
public:
System() : editor_(new Editor()) { ... }
private:
Editor* editor_;
}
class Editor {
friend class System;
Editor() { ... }
}
答案 1 :(得分:1)
您可以为编辑器创建抽象接口,并将实现嵌套在System的定义中。它甚至可以是protected
或private
。
class IEditor
{
public:
virtual int Whatever() = 0;
};
class System
{
public:
int foo;
IEditor *GetEditor() { return &m_Editor; }
protected:
class Editor
{
virtual int Whatever() { return 1; }
// etc...
}
Editor m_Editor;
}
答案 2 :(得分:0)
如果您不想创建嵌套类,可以使类编辑器成为System的朋友,并使编辑器的构造函数和析构函数成为私有。这样只允许System实例化和销毁类编辑器的实例。
答案 3 :(得分:0)
考虑将复制构造函数和复制赋值与构造函数一起设为私有。下面的示例显示,如果这两个方法不是私有的,则可以创建editor1和editor2。
class Editor {
private:
Editor();
friend class System;
};
class System {
public:
Editor editor;
};
int main() {
System system;
Editor editor1(system.editor);
Editor editor2 = system.editor;
return 0;
}
答案 4 :(得分:0)
为什么不将System
的状态分成另一个类?例如:
class SystemState {
};
class Editor {
public:
Editor(SystemState &state) :
state(state) {
}
private:
SystemState &state;
};
class System {
public:
System() :
editor(new Editor(state)) {
}
private:
SystemState state;
Editor *editor;
};