【问题标题】:C++ pointer to 2D array指向二维数组的 C++ 指针
【发布时间】:2012-05-19 10:49:45
【问题描述】:

您好,我知道有很多类似的问题,但我已经解决了这些问题,但我似乎无法让我的功能正常工作。我需要返回一个指向二维数组的指针。到目前为止,我正在使用此代码:

(这段代码是Level.cpp中的一个函数)

TileType* CLevel::getTiles()
{
TileType (*matrix_ptr)[31] = tiles;

return *matrix_ptr;
 } 

(TileType is an enum) 这个函数只返回一行,我显然需要两者。有什么建议吗?

头文件Level.h:

class CLevel 
{
private:

list<CBox> boxes;
TileType tiles[GRID_HEIGHT][GRID_WIDTH];
CPlayer player;

public:
CLevel();
~CLevel();

CPlayer* getPlayer();
list<CBox>* getBoxes();
TileType** getTiles();
};

【问题讨论】:

  • tiles 定义如下:TileType tiles[GRID_HEIGHT][GRID_WIDTH];
  • tiles 在头文件中定义。我将编辑我的问题以显示头文件

标签: c++ pointers multidimensional-array


【解决方案1】:

不要定义 getTiles()。

你完全打破了类的封装。这并不总是很重要,但在这种情况下,C/C++ 2D 数组不适合在可能不知道其维度的外部传递。

因此,将您对图块的操作定义为 CLevel 的方法。

【讨论】:

  • 无论设计多么有缺陷,这与所提出的问题无关
【解决方案2】:

你应该做的是:

// Class declaration
class CLevel
{
public:
   TileType (*getTiles())[GRID_WIDTH];

   TileType tiles[GRID_HEIGHT][GRID_WIDTH];

   //...
};

// Implementation
TileType (*CLevel::getTiles())[GRID_WIDTH]
{
   return tiles;
}

或者这个:

// Class declaration
class CLevel
{
public:
   TileType (&getTiles())[GRID_WIDTH][GRID_HEIGHT];

   TileType tiles[GRID_HEIGHT][GRID_WIDTH];

   //...
};

// Implementation
TileType (&CLevel::getTiles())[GRID_WIDTH][GRID_HEIGHT]
{
   return tiles;
}

这是一个有点复杂的声明,但请从里到外阅读:在这两种情况下,getTiles() 都是一个返回对二维图块数组的引用的函数(该示例显示了两种形式的语法)。通过调用getTiles(),您实际上指的是tiles。你甚至可以这样调用函数:getTiles()[i][j]

【讨论】:

  • 它有效,但我没有看到很多地方可以使用这种结构。
  • 我已经使用了您在此处编写的函数,但我收到一个错误,即“tiles”未定义。我不明白我是如何得到这个错误的:/我也得到一个错误,“函数返回数组是不允许的”。我还需要最终访问数组的元素,所以我需要调用你写的函数:getTiles()[i][j]。 (我正在使用此函数将图块存储在推箱子游戏的数组中)
  • 它在 gcc-4.3.4 上为我编译,请参阅 this。你用的是什么编译器?
  • 我正在使用 Visual C++ 2010 Express。但是,您并没有将函数作为类的一部分。我的函数如下所示: TileType CLevel::(*getTiles())[GRID_WIDTH] { return tiles; }
  • 当然还是有效的。我刚刚修改了答案,向您展示了两种声明 getTiles 的方式。如果您觉得这个答案有帮助,请点赞,然后按照here接受。
【解决方案3】:

如果你想返回一个指向二维数组的指针,那么你的函数声明应该是:

TileType** CLevel::getTiles()

你的返回应该是matrix_ptr,而不是它的指针内容(它是一个一维数组)。

return matrix_ptr;

【讨论】:

  • 执行此操作时出现错误:返回值类型与函数类型不匹配
  • 那么,你的 matrix_ptr 声明如何?
  • @RicardPérezdelCampo matrix_ptrgetTiles 中定义。
  • 就像我上面写的:TileType (*matrix_ptr)[31] = tiles;
  • 无法将二维数组转换为**
猜你喜欢
  • 2017-06-11
  • 2021-08-23
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
相关资源
最近更新 更多