【问题标题】:Use object property as array index returns error (C++)使用对象属性作为数组索引返回错误(C++)
【发布时间】:2014-04-29 03:43:26
【问题描述】:

我有一个名为 Matrix 的 C++ 类,它有一个行和列属性:

class Matrix
{
public:
    int rows, cols;
    float elements[36];
    // some methods, including constructor
}

我还有一个单独的函数,它应该将两个Matrix 对象的元素相加并返回第三个Matrix。代码是:

Matrix MatAdd(const Matrix& inMat1, const Matrix& inMat2)
{
    float elements[inMat1.rows*inMat2.cols];  // returns error
    // other code ...
}

我得到的实际错误如下(我在 VS 2013 上):

error C2057: expected constant expression

我尝试将 inMat1.rows 转换为 const int,但仍然遇到相同的错误。我一定是误解了一些核心 C++ 概念,但我无法通过在线搜索找到任何帮助。

谢谢, R.

【问题讨论】:

  • 编译器的错误信息很清楚。 inMat1.rows*inMat2.cols 不是常量表达式。您不能使用它在堆栈上创建 floats 数组。

标签: c++ class constants


【解决方案1】:

问题是您无法定义可变长度数组。长度需要在编译时知道。

解决方法是动态分配数组。

float* elements = new float[inMat1.rows*inMat2.cols];

您还必须更改Matrix 类的elements 成员。

【讨论】:

  • std::vector<float> elements;float *elements 更好,它更不容易出错并且需要您编写更少的支持代码。
  • @MattMcNabb 感谢您的更正。 Some C99 standards 在 C++11 中,但不是可变长度数组。
【解决方案2】:

数组的大小应该是恒定的:

    int a1[10]; //ok
    int a2[SIZE]; //ok if the value of SIZE is constant/ computable in compile time

您可以使用矢量来避免此错误。您还可以根据需要动态分配内存。

【讨论】:

    猜你喜欢
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    相关资源
    最近更新 更多