c++ - 如何在基类中声明类似工厂的方法?

标签 c++ oop

我正在寻找 C++ 类设计问题的解决方案。我想要实现的是在基类中使用静态方法方法,它将返回后代类型对象的实例。关键是,其中一些应该是单例。我正在用 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";
         }
      }
};

如果我是你,我会重新开始,记住这个例子和以下内容:

  • 工厂不必是单例
  • 工厂不必是静态成员
  • 工厂不必是它们创建的层次结构的基类成员
  • 工厂方法通常返回一个动态创建的对象
  • 工厂方法通常返回一个指针
  • 工厂方法需要一种方法来决定创建哪个类的实例

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

关于c++ - 如何在基类中声明类似工厂的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/959193/

相关文章:

c++ - 使用 EVT_NAVIGATION_KEY 处理事件不起作用

php - $this->dispatch ('/' ) 在 zend 测试中意味着什么

c++ - 我可以在 C++ 中破坏结构吗?

c++ - 通过整数文件读取整数

c++ - 你会如何转置二进制矩阵?

php - 面向对象的 MySQL 语句,PHP

python - 什么是 Python 中的兄弟类?

java - 为什么不允许 System.out.println(super)?

java - 该代码示例如何用 OO/设计模式术语定义?

c++ - std::string 操作:空白, "newline escapes '\'"和注释 #