2

クラスを定義しようとしています。これは私が持っているものです:

enum Tile {
GRASS, DIRT, TREE 
};

class Board {
public:
    int toShow;
    int toStore;
    Tile* shown;
    Board (int tsh, int tst);
    ~Board();
};

Board::Board (int tsh, int tst) {
    toShow = tsh;
    toStore = tst;
    shown = new Tile[toStore][toStore]; //ERROR!
}

Board::~Board () {
    delete [] shown;
}

ただし、指定された行で次のエラーが発生します-割り当てられた配列の最初の次元のみが動的サイズを持つことができます。

私ができるようにしたいのは、ハードコードするのではなく、パラメーター toShow をコンストラクターに渡し、表示したい要素のみを含む 2 次元配列を作成することです。

ただし、私の理解では、コンストラクターが呼び出されて初期化されると、そのサイズは toStore の現在の値に初期化されます。次に、toStore が変更されても、メモリは既に示されている配列に割り当てられているため、サイズは変更されません。ただし、コンパイラはこれを好みません。

私がこれをどのように理解しているかについて、真の誤解がありますか? 配列のサイズをハードコードすることなく、私がやりたいことを実行する修正を誰かが持っていますか?

4

5 に答える 5

3

C++ のコンテナーを使用します。それがその目的です。

class Board {
public:
    int toShow;
    int toStore;
    std::vector<std::vector<Tile> > shown;
    Board (int tsh, int tst) : 
      toShow(tsh), toStore(tst), 
      shown(tst, std::vector<Tile>(tst))
    {
    };
};

...

    Board board(4, 5);
    board.shown[1][3] = DIRT;
于 2012-06-04T19:08:32.457 に答える
2

1 次元配列を使用できます。2 次元配列は 1 次元配列として扱われ、可変サイズが必要な場合はこのパターンを使用できることを知っておく必要があります。例えば ​​:

int arr1[ 3 ][ 4 ] ;
int arr2[ 3 * 4 ] ;

それらは同じであり、それらのメンバーは異なる表記法でアクセスできます:

int x = arr1[ 1 ][ 2 ] ;
int x = arr2[ 1 * 4 + 2 ] ;

もちろん、arr1 は 3 行 x 4 列の行列と 3 列 x 4 行の行列として見ることができます。このタイプの多次元配列を使用すると、単一のポインターを介してそれらにアクセスできますが、その内部構造について知っておく必要があります。これらは、2 次元または 3 次元として扱われる 1 次元配列です。

于 2012-06-04T19:14:37.273 に答える
0

まず、2D 配列を参照する場合は、ポインターへのポインターを宣言する必要があります。

Tile **shown;

次に、エラーメッセージを見てください。きちんとしたわかりやすい英語です。エラーが何であるかを示します。Only the first dimension of an allocated array can have dynamic size.つまり、割り当てられた配列の最初の次元のみが動的サイズを持つことができるということです。それでおしまい。行列に複数の動的な次元を持たせたい場合は、C スタイルmalloc()を使用してポインターへのポインターを維持するか、C++ の場合はさらに優れておりvector、まさにこの目的のために作成された を使用します。

于 2012-06-04T18:57:29.753 に答える