C++ 类内定义的静态结构的静态成员的编译时默认值

C++ 类内定义的静态结构的静态成员的编译时默认值,c++,static,initialization,options,C++,Static,Initialization,Options,我想听听你的设计建议 我在C++中有一组类,每个类都有一组变量(双< /COD>和 int >代码>),它们决定了它们实现的算法的行为。 大概是这样的: class Foo { private: double value1, value2, etc...; public: void setOptions(double val1, double val2); /* and here other methods... */ }; class Bar { priva

我想听听你的设计建议

<>我在C++中有一组类,每个类都有一组变量(<代码>双< /COD>和<代码> int >代码>),它们决定了它们实现的算法的行为。 大概是这样的:

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...
  */
};
我希望将所有这些选项变量分组到一个类中,这样就可以动态地更改类实例中选项的变量,但我还希望为
变量提供一个默认值作为初始化

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

我采取了以下办法:

// 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;  
};
然后在
Foo
Bar
类中,我使用值
Options::fooooptions::option1
,依此类推

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

// Options.cpp
Options::FooOptions::option1 = 1.0;
我得到以下编译器
错误:错误:在“=”标记之前需要构造函数、析构函数或类型转换

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

// Options.cpp
Options::Options()
{
    FooOptions::option1=1.0;
}
当我试图从我的
main
访问未定义的引用时,我得到了
错误

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

如何实现一个只充当
double
int
值的容器的类,以便在类内部用作算法的参数?

这里是:

// Options.h
class Options
{
    public:
    static struct FooOptions
    {
      FooOptions() : option1(0.0), option2(0.1) {};
      double option1;
      double option2;
    } fooOptions;
};
类中不需要结构实例,因为它们的所有字段都是静态的

添加缺少的“double”:-)


应该这样做。

看来你对这门课的设计太过火了。一种简单的方法是将这些选项数据作为私有成员包含在类中,并提供公共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;
};

您忘记了定义中的类型:
double Options::fooptions::option1=1.0Doh!我已经失去了一个小时!!!非常感谢。您需要将所有类的选项组合在一个
options
类中,这有什么原因吗?不是每个类都应该有自己的选项集吗?我想用一个静态类嵌入和管理所有的类选项,这个静态类可以在程序中通过一些滑块进行简单的修改(这涉及到项目的Qt部分)。这样做有助于我将所有重要变量保存在一个类中,而不会丢失或忘记任何东西。我不希望它们是常量,因为这些参数必须在程序执行期间进行动态修改。您的评论是正确的,但是我希望我的变量有一个编译时默认值,并且能够动态地修改它们。可能是我设计这个类的方式,我忘记了“双精度”。顺便说一句,谢谢你的建议是的,没问题。只要记住总是使用最简单的设计。这会让你的生活更轻松;)
double Options::FooOptions::option1 = 1.0;
class Options
{
  public:
    /* choice=1: fooOptions
     * choice=2: barOptions
     * ..
     */
    Options(int choice);
    void SetOptions(..);
    void GetOptions(..);

  private:
    double option1;
    double option2;
};