C++ 类内定义的静态结构的静态成员的编译时默认值
我想听听你的设计建议 <>我在C++中有一组类,每个类都有一组变量(<代码>双< /COD>和<代码> int >代码>),它们决定了它们实现的算法的行为。 大概是这样的: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
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.0代码>Doh!我已经失去了一个小时!!!非常感谢。您需要将所有类的选项组合在一个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;
};