【问题标题】:Typedef of 2d array of pointers二维指针数组的类型定义
【发布时间】:2016-03-04 19:17:34
【问题描述】:

我正在尝试为我的二维指针数组定义一个类型,这样我就可以减少代码中的混乱。我有三分球,所以我认为它看起来很糟糕。 我设法使用 typedef 重构了代码,但它更像是反复试验。我想知道这实际上意味着什么:

typedef SomeClass* (&grid8x8)[8][8];

以及为什么这个函数返回 ok 值:

grid8x8 SomeOtherClass::getGrid()
{
    return grid;
}

在这种情况下,typedef 的语法让我感到困惑。

【问题讨论】:

  • 阅读 the clockwise/spiral rule 并重试。
  • 哦,我强烈建议您从类型别名定义中删除 &。这将导致您无法在何时何地使用引用的问题。
  • @JoachimPileborg grid8x8 是对 SomeClass 类型的 8x8 指针数组的引用?
  • 好一个@JoachimPileborg!感谢您的规则!
  • 是的,您的grid8x8 扣除是正确的。虽然我个人会更具体地说明该数组部分,说 grid8x8 是对 8 个数组的引用,该数组包含 8 个指向 SomeClass 的指针。

标签: c++ arrays pointers typedef


【解决方案1】:

typedef 表示:grid8x8 是对指向 SomeClass 的 8x8 指针数组的引用。

我想,SomeOtherClass::getGrid 函数是返回一个引用,然后返回一个成员变量 SomeOtherClass::grid

我会这样做:

typedef SomeClass* (grid8x8)[8][8];


const grid8x8& SomeOtherClass::getGrid()
{
    return grid;
}

这样,您可以拥有grid8x8 或对grid8x8 的引用。更通用一点,并且您不太可能忘记您有时不应该使用该参考。`

【讨论】:

  • 詹姆斯·鲁特,不错的收获。
【解决方案2】:

这是一个 C++11 的答案(问题毕竟被标记为 C++)

您可以使用 std::array 来存储您的网格而不是 C 数组。根据您对模板的偏好,语法有些简单。

#include <array>
typedef std::array<std::array<SomeClass*, 8>, 8> grid8x8;

【讨论】:

  • 我想稍后重构代码以适应 C++11,所以我认为这非常有用。谢谢!
【解决方案3】:

它是对整数 (int) 指针 (*) 的 8 x 8 数组 ([8][8]) 的引用 ((&amp;))。从最里面的括号内开始解析,从右到左,然后到右边,最后再到左边。相反,对指向 8 x 8 整数数组的指针的引用如下所示:

typedef int (*& RefToPtrToGrid)[2][2];

我个人觉得 c++11 风格更具可读性:

using RefTo8x8GridofPtr = int* (&) [8][8];

//or even better with std::array 
using Grid8x8 = std::array<std::array<int*,8>,8>&;

//or, more flexible:
template<size_t M,size_t N>
using Grid = std::array<std::array<int*,N>,M>&; //usage: Grid<8,8> myGrid;

另外,正如@Will Briggs 所说,您可能不想将引用作为类型的一部分:

using Grid8x8 = int* [8][8];
//... and so on

【讨论】:

    猜你喜欢
    • 2014-01-26
    • 1970-01-01
    • 2013-09-22
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多