【问题标题】:Compile time default values for static members of static struct defined inside classes类内部定义的静态结构的静态成员的编译时默认值
【发布时间】:2012-07-03 15:52:25
【问题描述】:

我想听听你的设计建议。

我有一组 C++ 类,每个类都有一堆变量(doubleint),这些变量决定了它们实现的算法的行为。

类似这样的:

class Foo
{
  private:
  double value1, value2, etc...;
  public: 
  void setOptions(double val1, double val2);
  /*
  and here other methods...
  */
};

class Bar
{
  private:
  double value1, value2, etc...;
  public: 
  void setOptions(double val1, double val2);
  /*
  and here other methods...
  */
};

我想将所有这些选项变量分组到一个类中,这样就可以动态更改类实例中的选项变量,但我也想给 value 变量一个默认值值作为初始化。

我希望选项变量不同,并在编译时为每个类设置一个默认值。

我采用了以下方法:

// Options.h
class Options
{
    public:
    Options();

    static struct FooOptions
    {
      static double option1;
      static double option2;
    } fooOptions;

    static struct BarOptions
    {
      static double option1;
      static double option2;
        // etcetera
    } barOptions;  
};

然后在FooBar 类中我使用值Options::FooOptions::option1 等等。

这里的问题是我无法静态初始化这些值。 我习惯在 .cpp 文件之外初始化静态成员,但在我的 .cpp 中

// Options.cpp
Options::FooOptions::option1 = 1.0;

我得到以下编译器 error: error: expected constructor, destructor, or type conversion before ‘=’ token

另一方面,如果我在构造函数中初始化它们:

// Options.cpp
Options::Options()
{
    FooOptions::option1=1.0;
}

当我尝试从我的main 访问它时收到undefined reference 错误。

我认为这里的问题是我有两个嵌套的静态结构。这种设计的最佳解决方案是什么?

您将如何实现一个仅充当 doubleint 值容器的类,以在类内部用作算法的参数?

【问题讨论】:

  • 你忘记了定义中的类型:double Options::FooOptions::option1 = 1.0;
  • 噢!我损失了一个小时!!!谢谢!
  • 您是否有理由需要将所有类的选项组合到一个 Options 类中?不应该每个班级都有自己的一组选项吗?
  • 我想使用静态类嵌入和管理所有类选项,该类可以在程序期间通过一些滑块进行简单修改(这涉及项目的 Qt 部分)。这样做有助于我将所有重要变量保留在一个类中,而不会丢失或忘记。

标签: c++ static initialization options


【解决方案1】:

看来你过度设计这个类。一种简单的方法是将这些选项数据作为私有成员包含在您的类中,并提供公共 setter/getter。

通过在构造函数中添加参数,您可以自定义默认行为。 通过添加 setter 和 getter,您可以动态更新行为,即在运行时。

class Options
{
  public:
    /* choice=1: fooOptions
     * choice=2: barOptions
     * ..
     */
    Options(int choice);
    void SetOptions(..);
    void GetOptions(..);

  private:
    double option1;
    double option2;
};

【讨论】:

  • 您的 cmets 是对的,但我希望我的变量具有编译时默认值并能够动态修改它们。可能是我设计该课程的方式来完成这项工作......我忘记了“双重”。顺便说一句,谢谢您的建议
  • 是的,没问题。请记住始终使用最简单的设计。它会让你的生活更轻松;)
【解决方案2】:

你在这里:

// Options.h
class Options
{
    public:
    static struct FooOptions
    {
      FooOptions() : option1(0.0), option2(0.1) {};
      double option1;
      double option2;
    } fooOptions;
};

你不需要类中的结构实例,因为它们的所有字段都是静态的。

【讨论】:

  • 我不希望它们是 const,因为这些参数必须在程序执行期间进行动态修改。
【解决方案3】:
// Options.cpp
Options::FooOptions::option1 = 1.0;

添加缺少的“双”:-)

double Options::FooOptions::option1 = 1.0;

应该这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 2014-02-17
    • 2012-12-20
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 2013-07-27
    相关资源
    最近更新 更多