我有一个系统类,可以返回指向编辑器类的指针。 编辑器类在系统类中实例化并且通过指向系统的私有变量。该类实质上充当了系统的内部数据结构的替代接口。C++模式禁止在特定范围之外的类的实例化?
我的问题: 做了设计模式存在,让我禁止编辑类的直接实例,但不知何故仍然初始化它系统里面?
谢谢。
我有一个系统类,可以返回指向编辑器类的指针。 编辑器类在系统类中实例化并且通过指向系统的私有变量。该类实质上充当了系统的内部数据结构的替代接口。C++模式禁止在特定范围之外的类的实例化?
我的问题: 做了设计模式存在,让我禁止编辑类的直接实例,但不知何故仍然初始化它系统里面?
谢谢。
你可以让Editor的构造函数保持私有状态,这样可以防止其他人实例化它,然后让系统成为朋友将允许它访问构造函数。
class System {
public:
System() : editor_(new Editor()) { ... }
private:
Editor* editor_;
}
class Editor {
friend class System;
Editor() { ... }
}
这样做的好处是不会使编辑器的成员函数间接(虚拟),这对每次调用都是一个小的(约7ns)CPU节省。 – Crashworks 2010-08-28 01:31:59
啊,这个朋友的东西正是我所需要的。对我来说新概念,谢谢。 – leo 2010-08-28 01:40:42
在这种方法中,编辑器不再是System类的接口。它不再为外界所知。! – Chubsdad 2010-08-28 02:46:36
您可以为您的编辑器创建抽象接口,并将实现嵌套在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;
}
+1我是抽象接口的粉丝;尽管嵌套类可能会变得混乱。 – joshperry 2010-08-28 01:56:44
如果你不想让嵌套类,你可以使类编辑系统的朋友,使编辑的构造和析构私人。这样,只有系统被允许实例化和销毁类编辑器的实例。
考虑将复制构造函数和复制赋值与构造函数一起私有化。下面的例子显示,如果这两个方法不是私有的,则可以创建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;
}
为什么不将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;
};
您描述的设计模式是所谓的“PIMPL成语”的变体。 – greyfade 2010-08-28 15:09:09