3

次のように定義されたクラスがあります。

class Obj {
public:
    int width, height;
    Obj(int w, int h);
}

次のような静的配列を含める必要があります。

int presc[width][height];

ただし、クラス内で定義することはできないため、2D 配列へのポインターを作成し (そして、好奇心から、3、4、および 5D 配列)、それをクラスのメンバーとして持ち、それを初期化することができます。コンストラクターは次のようになります。

int ar[5][6];
Obj o(5, 6, &ar);

編集:ここでの考え方は、すべてのオブジェクトの幅と高さが異なるため、そのオブジェクトを表すために使用する配列はオブジェクトに固有のものになりますが、その配列が(できればコンストラクターで)定義されると、変更されません. また、特定のオブジェクトの幅と高さの値は、コンパイル時に認識されます。

編集: 配列はpresc、2 つのオブジェクトの配列を 1 つの大きな配列に重ね合わせ、重複する場所を確認することによる衝突検出用です。次のように宣言します。

Obj player1(32, 32); //player with a width of 32 px and height of 32 px, presc[32][32]
Obj boss(500, 500); //boss with a width of 500 px and height of 500 px, presc[500][500]
4

3 に答える 3

4

いいえ。コンパイル時にクラスのサイズを知る必要があります。

実行時まで配列のサイズがわからない場合は、その配列をクラス メンバーとして持つことはできません (配列を動的に割り当てて、それへのポインターをクラスに格納するか、できれば使用する必要があります)。 a std::vector)。

于 2010-04-02T23:11:56.360 に答える
2

「動的」とは「ヒープ割り当て」を意味する場合、いいえ、現在の Obj でこれを行う方法はありません。OTOH、ご存知の場合whコンパイル時に:

template <int W, int H>
class Obj {
public:
    // ...
private:
    int presc[W][H];
}
于 2010-04-02T23:11:00.550 に答える
0

boost::arraystd::tr1::arrayどちらも一定サイズの配列を提供します。これらがまったく新しいタイプを作成することを理解してください。動的配列を使用しないと、多くのコードが必要以上に書きにくくなる可能性があります。クラスと、これらのオブジェクトで機能する関数をパラメーター化する必要があります。節約できるのは、単一のヒープ割り当てだけです。

于 2010-04-03T07:53:01.813 に答える