C ++多维数组成员访问器

时间:2015-09-21 18:10:31

标签: c++ multidimensional-array methods encapsulation accessor

我有一个类中有一个大的二维数组。它曾经是在堆上分配的动态数组,现在它是我更喜欢的静态大小。

private:
    int fontTextureCoords_[100][7];

我必须将类型转换添加到访问器中,以便返回数组以便在类之外进行访问,目前正常工作正常,但我不确定它是安全的还是正确的方法来处理它。

public:
inline int **getFontTextureCoords()
{   
    return (int**)fontTextureCoords_;
}

这样做是否安全/正确?还是有更优选的方法将指针返回到多维数组?

4 个答案:

答案 0 :(得分:4)

2d数组不能转换为指针指针。您必须返回一个指向数组的指针,这是使用typedef编写最容易的:

using T = int[7];
inline T* getFontTextureCoords() { return fontTextureCoords_; }

虽然返回完整数组的引用要好得多:

using T = int[100][7];
inline T& getFontTextureCoords() { return fontTextureCoords_; }

您也可以std::array<std::array<int, 7>, 100>

答案 1 :(得分:1)

也许这个图表显示了两种类型的多维数组声明之间的区别。 (有时人们不理解这一点。)

enter image description here

第一个说a是一个由100个连续的7个int块组成的单个块,或者总共700 ints个块,所有这些块都是一个整体。

第二个说a是一个指针数组,其中每个指针指向不同的ints块,散布在整个内存中。

编译器需要知道这一点,因为如果你编写a[i][j],它必须生成完全不同的代码。

答案 2 :(得分:0)

int fontTextureCoords_[100][7];等数组投射到int**是不对的。它会导致不确定的行为。

如果不是太多,请将getFontTextureCoords更改为:

inline int (*getFontTextureCoords()) [7]
{   
    return fontTextureCoords_;
}

并将其用作:

int (*ptr)[7] = getFontTextureCoords();

如果您可以选择使用std::vectorstd::array,则最好使用它们。

答案 3 :(得分:0)

C / C ++中没有多维数组。只有单个维度的数组。您可以拥有一维数组,其中每个元素都是另一个单维数组。虽然似乎没有区别,但它确实存在并且非常重要。

这正是传递逻辑不起作用的方式。每个人都经历过这一切。 &#39;如果将一维数组作为指向第一个元素的指针传递,则应将2-D数组作为指向第一个元素的指针传递,等等。但由于它不是二维数组,而是数组数组,因此无法应用逻辑。

您可以通过以下方式对其进行推理。让我们说,你有一个类型X的数组。

WindowsBase

如何访问5号元素?容易 -

X x[10];

但编译器在看到它时会做什么?它大致是这样的:

x[5] = 42;

所以它需要第一个元素的地址,并为它添加5来获取第5个元素的地址。但是添加5意味着什么?以字节为单位,应该从数组开头的地址跳过多少字节才能到达请求的内存位置?当然,5 * sizeof(X)。现在,如果你有2-D&#39;数组,声明如下:

*(&x[0] + 5) = 42;

你尝试通过指向指针的方法来处理它:

X x[2][3];

请记住,为了生成[] []的代码,编译器需要以*(px +)的方式表达。并且某些东西必须是数组的大小(因为数组的元素是数组)。但是你需要知道这个数组的大小,正如你所看到的,你的px没有编码任何数组大小。它知道的唯一尺寸是X的大小,这还不够。

希望它有意义,并解释为什么你不能使用int **而不是x [] []。