在另一个构造函数中调用对象数组的构造函数

Calling constructor for an array of objects in another constructor

我试图通过调用数组中每个对象的构造函数来硬编码对象数组中的一堆值,FloatParameterFields。我在另一个构造函数 ParametersServerABS().

中调用这些构造函数

对象数组 FloatParameterFieldsParametersServerABS class:

的私有成员
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[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]= { ... }

您正在将初始化列表(即值列表)分配到 _floatParameters 的第 FloatParameter::NUM_FLOAT_PARAMS 项中。要设置一个数组,您可以直接分配给 _floatParameterswill work with vector, but won't work 与普通的旧数组。

_floatParameters = { ... }

在进入你的构造函数的开头{之前,你所有的成员都已经初始化了。这包括 _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...
    }
{
}