C++ C++;指向二维数组的指针

C++ C++;指向二维数组的指针,c++,pointers,multidimensional-array,C++,Pointers,Multidimensional Array,嗨,我知道有很多类似的问题,但我已经通过了他们,我似乎无法使我的功能工作。我需要返回一个指向2D数组的指针。到目前为止,我正在使用以下代码: (此代码是Level.cpp中的函数) (TileType是一个枚举)这个函数只返回一行,我显然需要两行。有什么建议吗 头文件级别.h: class CLevel { private: list<CBox> boxes; TileType tiles[GRID_HEIGHT][GRID_WIDTH]; CPlayer player; pu

嗨,我知道有很多类似的问题,但我已经通过了他们,我似乎无法使我的功能工作。我需要返回一个指向2D数组的指针。到目前为止,我正在使用以下代码:

(此代码是Level.cpp中的函数)

(TileType是一个枚举)这个函数只返回一行,我显然需要两行。有什么建议吗

头文件级别.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();
};
classclevel
{
私人:
列表框;
瓷砖类型瓷砖[网格高度][网格宽度];
游戏玩家;
公众:
克利夫();
~CLevel();
CPlayer*getPlayer();
列表*getbox();
TileType**getTiles();
};

如果要返回指向2d数组的指针,则函数声明应为:

TileType** CLevel::getTiles()
您的返回应该是matrix_ptr,而不是它的指针内容(它是一个一维数组)


您应该做的是:

// 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]

不定义getTiles()

您完全破坏了类的封装。这并不总是重要的,但在这种情况下,C/C++2D数组不适合在其尺寸未知的外部传递


因此,请将您对平铺的操作定义为CLevel方法。

平铺的定义如下:平铺类型平铺[GRID_HEIGHT][GRID_WIDTH];平铺在头文件中定义。我将编辑我的问题以显示标题文件。当我这样做时,我得到一个错误:返回值类型与函数类型不匹配。那么,您的矩阵ptr声明如何?@RicardPérezdelCampo
matrix_ptr
getTiles
中定义。如我上面所述:TileType(*matrix_ptr)[31]=tiles;2D数组无法转换为
**
。它可以工作,但我看不到在很多地方这样的构造会有用。我使用了您在这里编写的函数,我收到一个错误,即“tiles”未定义。我无法理解我是如何得到这个错误的:/我还得到了一个错误,即“不允许函数返回数组”。我还需要最终访问数组的元素,因此我需要调用您编写的函数:getTiles()[I][j]。(我正在使用此函数在Sokoban游戏的数组中存储磁贴)它在gcc-4.3.4上为我编译,请参阅。你使用什么编译器?我使用Visual C++ 2010 Express。但是,您并没有使函数成为类的一部分。我的函数如下所示:TileType CLevel::(*getTiles())[GRID_WIDTH]{return tiles;}当然,它仍然有效。我刚刚修改了答案,向您展示了两种声明
getTiles
的方法。如果你觉得这个答案很有帮助,请把它投上去,然后根据你的意见接受它。无论这个设计有多大的缺陷,这都与你提出的问题无关
// 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;
}