【问题标题】:2D array of structures with new keyword in C++!C++ 中带有 new 关键字的二维结构数组!
【发布时间】:2013-12-06 17:40:10
【问题描述】:

我在一个名为“xxx.h”的文件中定义了一个结构:

struct struct_name
{
   declarations;
};

我在另一个 c++ 文件 yyy.cpp 中包含了这个头文件 - 'xxx.h'

然后我尝试使用 new 关键字创建上述结构的二维数组,如下所示(我通过此链接学习了如何创建二维结构数组:Declaring a 2D array of type struct in c++)。

struct struct_name * some_name;
some_name = new struct struct_name[x][y];

编译时出现以下错误:error: ‘y’ cannot appear in a constant-expression。这个错误特别指向数组的第二维。

此外,当我尝试使用以下值初始化这个二维结构数组时:

some_name[i][j].var_name = value;

我收到以下错误:

error: no match for ‘operator[]’ in ‘*(some_name + ((sizetype)(((unsigned int)i) * 12u)))[j]’

请告诉我如何解决这个问题。

谢谢。

【问题讨论】:

    标签: c++ structure multidimensional-array


    【解决方案1】:

    为了让您尽快启动并运行,我将避免通常的内存布局攻击,并简单地告诉您解决问题的一种方法。

    发生错误的原因是因为 C++ 在声明数组、分配数组等时需要了解类型。当你这样做时:

    some_name = new struct_name[x][y];
    

    您告诉编译器的是“我想分配 x 类型为 struct_name[y] 的对象”。但是struct_name[y] 不是编译时已知的type。大小是未知的,但必须是已知的(因此关于 constexpr 期望的错误。这将起作用:

    struct_name (*some_name)[WIDTH] = new struct_name[x][WIDTH];
    

    如果WIDTH 是编译时已知常量,则可以使用。但对你来说,这不是一成不变的,所以需要另一种解决方案。


    替代方法

    下面介绍了另一种快速修复方法

    #include <vector>
    
    int main()
    {
        int rows, cols;
    
        // get row and column count.
    
        typedef std::vector<struct_name> MatrixRow;
        typedef std::vector<MatrixRow> Matrix;
        Matrix some_name(rows, MatrixRow(cols));
    
        // use some_name[i][j] however you need
    
        return 0;
    }
    

    还有其他方法可以做到这一点,但这可能是让您跑步的最快方法。此外,它促进了正确的RAII 概念。如果您需要 2D 矩阵的更特殊用途,您可能需要开发自己的类,因为 C++ 标准库本身没有直接的 2D 动态数组概念,因此我们使用向量类型的向量来发明它。

    【讨论】:

    • 谢谢@WhozCraig。我会试试这个,让你知道。
    • 非常感谢 WhozCraig。您的替代方法有效:-) 我使用了替代方法,因为 WIDTH 仅在运行时输入。
    • @Casey 感谢您的修复。非常感谢更正。正在路上!去圣诞节购物,有点赶时间。再次感谢。
    【解决方案2】:

    尝试 yyy.cpp 中的声明为:

    struct struct_name **some_name;
    

    原因是some_name[i] 需要是struct_name * 类型才能访问另一个级别的变量。

    【讨论】:

    • 注意:动态数组指针的动态数组与真正的二维数组不同。类型和内存布局都明显不同,幸运的是,OP 将拥有一个足够聪明的工具链,以防止他将它们视为平等,因为它们不是。除了语法糖之外,它们是完全不同的野兽。
    • @Tower:谢谢,您的建议帮助我摆脱了错误:'no match for operator...' 但是,错误'y 不能出现在常量表达式中'仍然出现跨度>
    【解决方案3】:

    你真的需要一个 c++ 数组吗?

    为什么不使用std::vector&lt;std::vector&lt;struct_name&gt;&gt;

    如果您不需要动态分配,那么您可以使用:

    std::array&lt;std::array&lt;struct_name, 2&gt;, 3&gt; 其中 2 和 3 是二维数组的大小。

    【讨论】:

      猜你喜欢
      • 2016-06-23
      • 2021-09-22
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多