C ++模式禁止在某个范围之外实例化类?

时间:2010-08-28 01:20:39

标签: c++ design-patterns class

我有一个系统类,可以返回指向编辑器类的指针。 编辑器类在系统类中实例化,并传递指向系统的私有变量的指针。 编辑器类本质上是系统的内部数据结构的替代接口。

我的问题: 是否存在允许我禁止直接实例化编辑器类的设计模式,但仍以某种方式在系统中实例化它?

感谢。

5 个答案:

答案 0 :(得分:6)

您可以将Editor的构造函数设为私有,这样可以阻止其他人实例化它,然后让System成为朋友将允许它访问构造函数。

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

private:
    Editor* editor_;
}

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

答案 1 :(得分: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;
}

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