0

我对 C++ 和 OO 编程还很陌生,并且在以正确的方式设计我的类时遇到了一些麻烦。我的应用程序基于一组可以由用户在配置文件中设置的参数。这些参数在执行开始时被读入,并被分配到不同的程序部分,即基于这些执行不同任务的参数构建类。但类似于这个问题

将多个参数传递给函数的优雅方式

某些类可能取决于许多不同的参数/选项(例如 9)。这些参数可以指定类本身或公共成员函数的执行。这些选项/参数在执行期间不应更改。我考虑过不同的解决方案,将所有参数嵌入到适当的类中,以避免丑陋的函数/构造函数调用,但似乎没有人对我有吸引力。

1) 仅存储每个类中构造所需的参数。其余部分根据需要从保存配置文件的结构传递给成员函数。

class A {
  int x_, y_;
 public:
  A(int x, int y, int Opt3) : ... {}
  void Method1(int Opt1, int Opt2);
  void Method2(int Opt1, int Opt4);
  ...
}

优点:类及其方法对参数的依赖性变得明显。缺点:这也可能导致带有许多参数的函数调用。这也不理想,因为每次调用此函数时我都必须明确指定所有选项,尽管选项不会改变。

2)在构造时将所有参数传递给类,并使它们成为私有成员变量。这导致类型的构造函数

class A {
  int x_, y_, Opt1, Opt2, ...
 public:
  A(int x, int y, Opt1, Opt2, ...) : ... {}
  //some methods
  .
  .
  .
}

如果在创建该类的多个对象时总是必须明确指定所有参数,这很烦人。

3) 将所有参数保存在一个大型结构中。使指向该结构的共享指针成为每个类的私有成员变量。优点:构造函数只需要一个指针。缺点:从类接口中,不清楚该类使用了配置中的哪些参数。评论可能会澄清这一点。

4) 灵感来自于

将多个参数传递给函数的优雅方式

在每个包含所需参数的类中定义一个嵌套选项结构,例如

class A {
  int x_, y_;
 public:
  A(int x, int y, Options& Opt) : ... {}
  struct Options {
    int Opt1 = default_value;
    int Opt2 = default_value;
     .
     .
     .
  } Opt;
}

优点:从界面可以清楚地看到此类使用了哪些选项。通过向选项类添加成员函数,可以直接从配置文件中读取这些选项。用户可以在没有配置文件的情况下创建此类特定选项集的实例,并且可以根据需要更改默认值。除了构造类的通用参数之外,只有这样的选项集必须提供给构造函数。其实这是我最喜欢的方法。

缺点:我很难区分哪些参数应该是类的私有成员变量或应该属于选项集。这导致了一个问题,即成员变量是什么以及类/成员函数的选项是什么。你有什么建议吗?

你能评论一下我的想法并给出一些建议吗?

谢谢 !

4

0 回答 0