c++ - 抽象基类中的静态常量变量

标签 c++ class inheritance abstract-class

我有一个抽象基类,它用于派生一些类。 这些类的某些属性在所有类之间共享,并且这些属性应该是不可修改的。

为了在所有 10 个类中共享一个变量,我将其设为静态。

class ABC{
public:
  static int *anArray;
  int index;
  static int tot_index;
  virtual void print()=0;
  ABC(){index=tot_index++;};
  virtual ~ABC(){};
};

这很好用,tot_index 将包含实例化的类的数量,索引是每个类的唯一标识符。

我遇到的问题是 *anArray 和派生类的数量是在运行时设置的,在类被实例化后我不想修改这些值。

我有点困惑:

1) 我应该在哪里设置 *anArray 值?只是在一些随机的派生类中?

2) 如果一个变量应该是不可修改的,那么我应该将它设置为常量。但是,如果我在编译时不知道该值是什么,我该如何将其设置为 const?

最佳答案

有一些模式可以实现这一点,而不是使用静态变量。

最容易实现的是将共享变量放在单例基类中(引用:GoF Singleton 模式),尽管出于多种原因并不是最好的。

另一个更漂亮的解决方案可能是某种工厂模式,例如 GoF 抽象工厂。

编辑: 另外,对于文档的评论,请参见:http://www.parashift.com/c++-faq/static-init-order-on-first-use.html

:)

关于c++ - 抽象基类中的静态常量变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13905704/

相关文章:

c++ - C++中的简单交互式提示

swift - 调整自定义类以与 CoreData 兼容

ruby - 什么是 Ruby 中的单例类?

python - 为用户定义的类实现 __delattr__

PHP (7.1) 继承问题

c++ - 周期性时间间隔调用函数的API

c++ - 这段代码是如何工作的? (多集排序)

vb.net - 是否可以在 VB.net 中测试两种类型是否具有相同的未知继承?

c++ - 在 Linux 上编写 OpenGL 4.X 应用程序的常用库有哪些?

c++ - operator() 的继承