C++类设计,"虚拟选项结构和设置器"?



我不确定在这个上搜索什么,这是一个"虚拟成员变量"还是类似的东西

class ConcreteClass: public AbstractBaseclass {
public:
  struct Options {
     int x;
     string foo;
  };
  int options(int ac, char ** av, Options& opts) {
  // Declare the supported options.
  po::options_description desc("Allowed options");
  // ... etc, fill in with boost program options 
  }
  virtual void  MandatoryFunction1( ... ) { } 
  }

不同类型的"混凝土类"会有根本不同的东西。。。从其他地方继承Options似乎很愚蠢,因为它必须是一个空的基结构。

有没有一种智能的方法可以通过"AbstractBaseclass"强制派生类必须声明一些"Options"结构,并提供一个函数"Options(("来填充它?这只是为了强制与核心库在派生类中的使用方式保持一致。

*编辑:如果我需要编辑基类来支持这一点,这是可以的。我想也许让它包含一个纯虚拟的options((函数,但我不确定让它接受一个待定义的"options"结构是什么好方法。

我已经看到了一些这样的我如何强迫扩展我的类的人做X类型的问题。真正的问题是你为什么要强迫它你是需要他们来做,还是只是想让?

如果你需要他们来实现该功能,这意味着代码的某些部分实际上会使用,如果他们不实现,编译器将触发错误并无法编译,你的问题就可以在不做任何事情的情况下得到解决。

如果你只是想让他们这样做,重新思考你的策略。强迫他人的代码做一些不需要的事情是没有意义的。也许你的类的某些扩展根本不需要选项,为什么他们不需要来实现该函数,而你也不需要它们?

请注意,很少会发现依赖于实现的任何X::Options结构的代码(模板除外(,因为您将无法通用地使用该代码——C++使用静态类型。因此,很可能您不是在一般性地使用该代码,或者您需要一个Options接口。如果你在模板中使用它,代码将无法编译模板,你甚至可以在模板中计算出如何生成一个简单易读的错误消息(想想static_assert(,如果你不使用它,问题就来了:为什么

只需遵循两个简单的步骤,您就会得到您想要的:

(1( 使options()方法在AbstractBaseclass中成为纯virtual,因此它将强制每个子class实现它:

(2( 使struct Options位于AbstractBaseclass下的private说明符内。因此,现在每个子class都必须有自己的Options来满足virtual options()参数。

所以总的来说,你的基础class看起来像:

class AbstractBaseclass {
  struct Options {};  // private
public:  // pure virtual 
  virtual int options(int ac, char ** av, Options& opts) = 0;
};

最新更新