【问题标题】:Calling constructor for an array of objects in another constructor在另一个构造函数中为对象数组调用构造函数
【发布时间】:2015-01-26 09:44:29
【问题描述】:

我试图通过调用数组中每个对象的构造函数来硬编码对象数组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)'

进一步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>')

我第一次尝试时最困惑,为什么它错了?这似乎是有道理的,但我得到了一个错误......我什至正确地包含了头文件。

【问题讨论】:

    标签: c++ arrays object struct constructor


    【解决方案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...
        }
    {
    }
    

    【讨论】:

    • 哦,它们是在我初始化私有结构数组的部分初始化的吗?
    • @JustinLiang 它们在构造对象时被初始化,在进入构造器主体之前。
    【解决方案2】:

    您正在调用_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 带有向量,但 won't work 带有普通的旧数组。

    _floatParameters = { ... }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 2015-07-02
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 2016-07-03
      相关资源
      最近更新 更多