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

标签 c++ arrays object struct constructor

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

对象数组 FloatParameterFieldsParametersServerABS 类的私有(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/

相关文章:

c++ - 如何消除具有相同名称的命名空间和类的歧义

c++ - 将秒转换为时分秒

JAVA-将数组返回到main

c++ - 如何修复此左值警告?

javascript - 渲染 react 组件时出错(对象而不是字符串)

c++ - C++14 中通用 lambda 的奇怪编译器行为

c++ - 如果在 C 中将 int 传递给 byte 参数会发生什么?

ruby-on-rails - 从 JSON 字符串中提取 JSON 对象

c# - C#中两个数组的相关性

c++ - 读取输入以构造对象