我试图通过调用数组中每个对象的构造函数来硬编码对象数组 FloatParameterFields
中的一堆值。我在另一个构造函数 ParametersServerABS()
中调用这些构造函数。
对象数组 FloatParameterFields
是 ParametersServerABS
类的私有(private)成员:
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>')
我第一次尝试时最困惑的是,为什么会出错?这似乎有道理,但我收到错误...我什至正确地包含了头文件。
最佳答案
在进入构造函数的开头 {
之前,所有成员都已初始化。这包括 _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...
}
{
}
关于c++ - 在另一个构造函数中调用对象数组的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28147707/