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

Calling constructor for an array of objects in another constructor

本文关键字:构造函数 数组 调用 对象 另一个      更新时间:2023-10-16

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

对象数组FloatParameterFieldsParametersServerABS 类的私有成员:

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)'

经过进一步的研究,我尝试了:

    // 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...
    }
{
}

你调用_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项。设置直接分配给_floatParameters的阵列。这将适用于矢量,但不适用于普通的旧数组。

_floatParameters = { ... }