我正在寻找C++类设计问题的解决方案。我想要实现的是在基类中使用静态方法method,该方法将返回后代类型的对象的实例。关键是,其中一些应该是单例。我正在VCL中编写它,因此可以使用__properties,但是我更喜欢纯C++解决方案。

class Base {
  private:
    static Base *Instance;
  public:
    static Base *New(void);
    virtual bool isSingleton(void) = 0;
}
Base::Instance = NULL;

class First : public Base { // singleton descendant
  public:
    bool isSingleton(void) { return true; }
}

class Second : public Base { // normal descendant
  public:
    bool isSingleton(void) { return false; }
}

Base *Base::New(void) {
  if (isSingleton())
    if (Instance != NULL)
      return Instance = new /* descendant constructor */;
    else
      return Instance;
  else
    return new /* descendant constructor */;
}

出现问题:
  • 如何声明静态变量Instance,因此在子类
  • 中它将是静态的
  • 如何在基类
  • 中调用后代构造函数

    我认为可能无法按照我的计划克服这些问题。如果是这样,我希望获得有关如何以其他方式解决问题的一些建议。

    编辑:代码中的一些细微更改。我错过了几个指针标记。

    最佳答案

    只是要检查一下我们的术语是否同步-在我的书中,工厂类是一个类实例,可以创建其他一个或多个类的实例。创建哪种实例类型的选择是基于工厂收到的输入,或者至少基于工厂可以检查的内容。这是一个非常简单的工厂:

    class A { ~virtual A() {} };
    class B : public A {};
    class C : public A {};
    
    class AFactory {
       public:
          A * Make( char c ) {
             if ( c == 'B' ) {
                 return new B;
             }
             else if ( c == 'C' ) {
                return new C;
             }
             else {
               throw "bad type";
             }
          }
    };
    

    如果我是您,请记住以下示例并重新开始:
  • 因子不必是单例
  • 工厂不必是静态成员
  • 工厂不必成为其创建的
  • 层次结构的基类成员
  • 工厂方法通常返回动态创建的对象
  • 工厂方法通常返回一个指针
  • 工厂方法需要一种方法来决定创建
  • 实例的类

    我不明白为什么您的工厂需要反射(reflection),而C++在任何情况下都没有以有意义的方式支持。

    10-08 14:36
    查看更多