我想向您提出设计建议。
我在C ++中有一组类,每个类都有一堆变量(double
和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...
*/
};
我想将所有这些选项变量分组到一个类中,这样就可以动态地更改类实例中选项的变量,但我还想给出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;
};
然后在Foo
和Bar
类中,我使用值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;
}
当我尝试从undefined reference
访问它时出现main
错误。
我认为这里的问题是我有两个嵌套的静态结构。什么可以作为这种设计的最佳解决方案?
如何实现仅作为double
和int
值容器的类,以便在类中使用作为算法的参数?
答案 0 :(得分:4)
// Options.cpp Options::FooOptions::option1 = 1.0;
添加缺少的“双”: - )
double Options::FooOptions::option1 = 1.0;
应该这样做。
答案 1 :(得分:1)
你在这里:
// Options.h
class Options
{
public:
static struct FooOptions
{
FooOptions() : option1(0.0), option2(0.1) {};
double option1;
double option2;
} fooOptions;
};
您不需要类中的结构实例,因为它们的所有字段都是静态的。
答案 2 :(得分:0)
您似乎过度设计该课程。一种简单的方法是将这些选项数据作为私有成员包含在您的类中,并提供公共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;
};