我试图通过调用数组中每个对象的构造函数来硬编码对象数组中的一堆值FloatParameterFields
。我在另一个构造函数ParametersServerABS()
中调用这些构造函数。
对象数组FloatParameterFields
是ParametersServerABS
类的私有成员:
private:
FloatParameterFields _floatParameters[FloatParameter::NUM_FLOAT_PARAMS];
bool _safeMode;
在另一个文件中,我定义了枚举和结构:
enum FloatParameter {
CHIP_CLOCK_RATE_0 = 0,
CHIP_CLOCK_RATE_1,
CHIP_CLOCK_RATE_2,
CHIP_CLOCK_RATE_3,
CHIP_CLOCK_RATE_4,
NUM_FLOAT_PARAMS
};
enum AccessModes {
READ_ONLY = 0,
SAFE_WRITE,
WRITE,
NUM_ACCESS_MODES
};
struct FloatParameterFields {
public:
FloatParameterFields() :
upperBound(0),
lowerBound(0),
value(0),
id(NUM_FLOAT_PARAMS),
mode(NUM_ACCESS_MODES) {
}
FloatParameterFields(float upperBound, float lowerBound, float value, FloatParameter id,
AccessModes mode) :
upperBound(upperBound),
lowerBound(lowerBound),
value(value),
id(id),
mode(mode) {
}
float upperBound;
float lowerBound;
float value;
FloatParameter id;
AccessModes mode;
};
在我的第一次尝试中,我做了:
ParametersServerABS::ParametersServerABS() :
_safeMode(true) {
// Hardcoding the values to the struct
_floatParameters[FloatParameter::CHIP_CLOCK_RATE_0](2.0, 2.0, 1.0,
FloatParameter::CHIP_CLOCK_RATE_0, AccessModes::WRITE);
_floatParameters[FloatParameter::CHIP_CLOCK_RATE_1](2.0, 2.0, 1.0,
FloatParameter::CHIP_CLOCK_RATE_1, AccessModes::SAFE_WRITE);
_floatParameters[FloatParameter::CHIP_CLOCK_RATE_2](2.0, 2.0, 1.0,
FloatParameter::CHIP_CLOCK_RATE_2, AccessModes::WRITE);
_floatParameters[FloatParameter::CHIP_CLOCK_RATE_3](2.0, 2.0, 1.0,
FloatParameter::CHIP_CLOCK_RATE_3, AccessModes::WRITE);
_floatParameters[FloatParameter::CHIP_CLOCK_RATE_4](2.0, 2.0, 1.0,
FloatParameter::CHIP_CLOCK_RATE_4, AccessModes::READ_ONLY);
}
这给出了错误:
no match for call to 'FloatParameterFields) (double, double, double, FloatParameter, AccessModes)'
进一步research我尝试了:
// Hardcoding the values to the struct
_floatParameters[FloatParameter::NUM_FLOAT_PARAMS]= {FloatParameterFields(2.0, 2.0, 1.0,
FloatParameter::CHIP_CLOCK_RATE_0, AccessModes::WRITE),
FloatParameterFields(2.0, 2.0, 1.0,
FloatParameter::CHIP_CLOCK_RATE_1, AccessModes::SAFE_WRITE),
FloatParameterFields(2.0, 2.0, 1.0,
FloatParameter::CHIP_CLOCK_RATE_2, AccessModes::WRITE),
FloatParameterFields(2.0, 2.0, 1.0,
FloatParameter::CHIP_CLOCK_RATE_3, AccessModes::WRITE),
FloatParameterFields(2.0, 2.0, 1.0,
FloatParameter::CHIP_CLOCK_RATE_4, AccessModes::READ_ONLY)}
得到了错误:
no match for 'operator=' (operand types are 'FloatParameterFields' and '<brace-enclosed initializer list>')
我第一次尝试时最为困惑,为什么这是错的?它似乎有意义,但我得到一个错误......我甚至正确地包括了头文件。
答案 0 :(得分:1)
您正在调用_floatParameters[FloatParameter::CHIP_CLOCK_RATE_0](...)
,就像您拥有一系列功能一样,并且您正在调用其中一项。尽管C ++中确实存在函数数组,但它似乎并不是你想要实现的。
简单地说,你不能像这样调用构造函数。这是一个正确的例子:
_floatParameters[FloatParameter::CHIP_CLOCK_RATE_0] = FloatParameterFields(2.0, 2.0, 1.0, FloatParameter::CHIP_CLOCK_RATE_0, AccessModes::WRITE);
你的另一种方法可行,但有一个错误。
_floatParameters[FloatParameter::NUM_FLOAT_PARAMS]= { ... }
您将初始化列表(即值列表)分配到FloatParameter::NUM_FLOAT_PARAMS
的{{1}}项中。要设置阵列,您可以直接分配给_floatParameters
。那个will work带有向量,但是won't work带有普通的旧数组。
_floatParameters
答案 1 :(得分:1)
在进入构造函数的开头{
之前,所有成员都已初始化。这包括_floatParameters
数组及其所有元素。然后当你做...
_floatParameters[FloatParameter::CHIP_CLOCK_RATE_0](2.0, 2.0, 1.0,
FloatParameter::CHIP_CLOCK_RATE_0, AccessModes::WRITE);
...这被视为试图调用_floatParameters[FloatParameter::CHIP_CLOCK_RATE_0]
,好像它是一个类似函数的对象。它不被视为初始化器,因为对象已经初始化。
同样,您稍后会这样做:
_floatParameters[FloatParameter::NUM_FLOAT_PARAMS]= { ... };
在数组初始化之后尝试使用数组的初始化语法。
相反,您可以使用构造函数的成员初始化列表:
ParametersServerABS::ParametersServerABS()
: _safeMode(true),
_floatParameters{
{2.0, 2.0, 1.0, FloatParameter::CHIP_CLOCK_RATE_0, AccessModes::WRITE},
// and so on...
}
{
}