2010-08-28 44 views
3

我有一个系统类,可以返回指向编辑器类的指针。 编辑器类在系统类中实例化并且通过指向系统的私有变量。该类实质上充当了系统的内部数据结构的替代接口。C++模式禁止在特定范围之外的类的实例化?

我的问题: 做了设计模式存在,让我禁止编辑类的直接实例,但不知何故仍然初始化它系统里面?

谢谢。

+0

您描述的设计模式是所谓的“PIMPL成语”的变体。 – greyfade 2010-08-28 15:09:09

回答

6

你可以让Editor的构造函数保持私有状态,这样可以防止其他人实例化它,然后让系统成为朋友将允许它访问构造函数。

class System { 
public: 
    System() : editor_(new Editor()) { ... } 

private: 
    Editor* editor_; 
} 

class Editor { 
    friend class System; 
    Editor() { ... } 
} 
+0

这样做的好处是不会使编辑器的成员函数间接(虚拟),这对每次调用都是一个小的(约7ns)CPU节省。 – Crashworks 2010-08-28 01:31:59

+0

啊,这个朋友的东西正是我所需要的。对我来说新概念,谢谢。 – leo 2010-08-28 01:40:42

+0

在这种方法中,编辑器不再是System类的接口。它不再为外界所知。! – Chubsdad 2010-08-28 02:46:36

1

您可以为您的编辑器创建抽象接口,并将实现嵌套在System的定义中。它甚至可以是protectedprivate

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; 
} 
+0

+1我是抽象接口的粉丝;尽管嵌套类可能会变得混乱。 – joshperry 2010-08-28 01:56:44

0

如果你不想让嵌套类,你可以使类编辑系统的朋友,使编辑的构造和析构私人。这样,只有系统被允许实例化和销毁类编辑器的实例。

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; 
} 
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; 
};