【问题标题】:How to return two-dimensional arrays in C++如何在 C++ 中返回二维数组
【发布时间】:2024-04-15 16:35:01
【问题描述】:

我正在尝试为我之前制作的 3D 引擎端口实现一个 Matrix4x4 类。这是我目前在头文件中的内容:

#ifndef MAT4_H
#define MAT4_H

class Matrix4
{

public:
   Matrix4() {}
   float[4][4] getMatrix() { return m; }
   //...
   //other matrix related methods are omitted
   //...
private:
   float m[4][4]; 

};

#endif

但是应该返回二维数组的方法导致这个错误:

src/Matrix4.h:13:10: error: expected unqualified-id before '[' token
    float[4][4] getMatrix() { return m; }
         ^

如果这个问题已经有了答案,我很抱歉,但我在这个网站上找到的答案通常是关于返回指针而不是数组。希望你能帮忙,谢谢。

【问题讨论】:

  • 改为返回vector<vector<float> >
  • @taocp 这与二维数组完全不同。推测某些代码需要数据是一个连续的块。
  • 您可以返回float[][]。但是向量可能是更好的解决方案。
  • @taocp 是的,这可以解决我的问题,但是没有办法用数组来做到这一点吗?
  • @PetrPervukhin 我之前尝试过float[][],似乎也没有用

标签: c++ arrays multidimensional-array


【解决方案1】:

我建议使用std::array。但是直接在代码中使用它,作为多数组,有点难看。所以我建议一个别名,定义为:

#include <array> 

namespace details 
{    
   template<typename T, std::size_t D, std::size_t ... Ds> 
   struct make_multi_array 
    : make_multi_array<typename make_multi_array<T,Ds...>::type, D> {}; 

   template<typename T, std::size_t D>
   struct make_multi_array<T,D> { using type = std::array<T, D>;  };
}

template<typename T, std::size_t D, std::size_t  ... Ds> 
using multi_array = typename details::make_multi_array<T,D,Ds...>::type;

然后将其用作:

public:

   multi_array<float,4,4> getMatrix() { return m; }

private:
   multi_array<float,4,4> m;

您也可以在其他地方使用别名,例如:

 //same as std::array<int,10> 
 //similar to int x[10] 
 multi_array<int,10>   x;   

 //same as std::array<std::array<int,20>,10>
 //similar to int y[10][20] 
 multi_array<int,10,20> y;   

 //same as std::array<std::array<std::array<int,30>,20>,10>
 //similar to int z[10][20][30]
 multi_array<int,10,20,30> z; 

希望对您有所帮助。

【讨论】:

  • 如何访问或修改multi_array的元素?对不起,我对模板了解不多
  • 就像您访问/修改普通数组(C 数组)一样,例如 m[i][j] = 10.5
  • 或者,vectormulti_array
  • 请注意,有一个小问题:std::array 中的 std::array 不能保证所有子元素都连续存储。它们之间可能散布着数据(尽管我不知道是否有一个实现确实这样做。)
  • 还有一个快速的问题需要仔细检查:我将别名的定义放在全局范围内对吗?
【解决方案2】:

在 C 或 C++ 中传递数组可以通过传递指向其第一个元素的指针来实现 - 指针是按值传递的。

按值传递数组的唯一方法是封装它 在结构中,但在大多数情况下,最好传递一个指针然后按值复制所有数据。

【讨论】:

    【解决方案3】:

    只返回一个指向数组第一个元素的指针! :)

    【讨论】:

    • 欢迎来到 Stack Overflow,感谢您的贡献。但是,在您的答案中添加一些代码会更好。