0

こんにちは、似たような質問がたくさんあることは知っていますが、私はそれらを経験してきましたが、自分の機能を機能させることができないようです。2D 配列へのポインターを返す必要があります。これまでのところ、私はこのコードを使用しています:

(このコードは Level.cpp の関数です)

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

return *matrix_ptr;
 } 

(TileType は列挙型です) この関数は 1 つの行を返すだけで、明らかに両方が必要です。助言がありますか?

ヘッダー ファイル 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();
};
4

3 に答える 3

2

getTiles() を定義しないでください。

クラスのカプセル化を完全に破っています。これは常に問題になるわけではありませんが、この場合、C/C++ 2D 配列は、その次元が不明な可能性がある外部に渡すのに適した構造ではありません。

したがって、タイルに対する操作を CLevel のメソッドとして定義します。

于 2012-05-19T11:23:51.760 に答える
1

あなたがすべきことは、次のいずれかです:

// 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()、タイルの 2D 配列への参照を返す関数です (例では 2 つの形式の構文を示しています)。を呼び出すgetTiles()ことで、実際にはtiles. この方法で関数を呼び出すこともできます: getTiles()[i][j].

于 2012-05-19T11:13:31.540 に答える
-1

2 次元配列へのポインターを返したい場合は、関数宣言を次のようにする必要があります。

TileType** CLevel::getTiles()

また、戻り値は、ポインターの内容 (1 次元配列) ではなく、matrix_ptr にする必要があります。

return matrix_ptr;
于 2012-05-19T11:06:02.977 に答える