0

私は2つのクラスを持っています:

class A

class B: class A

各ポインターが B を指すマトリックス (1X2 のマット) を作成したいと考えています。

だから私は定義しました:

A **mat;

mat = new A*[1];
*mat = new B[2]; // call the constructor.

これで、mat[0][0]、mat[0][1] の 2 つの要素ができました。

mat[0][0] は初期化されていますが、mat[0][1] は NULL です。

助けてください。

4

2 に答える 2

1

B へのポインターが必要な場合は、A について何も指定する必要はありません。B は A を派生させるため、大きい方 (この場合は B) にスペースを割り当てるだけで済みます。

ポインターのマトリックスの場合、次のものが必要になります。

B *** mat;
mat = new B**[1]; //Dimension 1 
mat[0] = new B*[2]; //Dimension 2 (array of pointers)
mat[0][0] = new B(); //Allocate B in [0][0]
mat[0][1] = new B(); //Allocate B in [0][1]

ただし、常に 1x2 になることがわかっている場合は、次のようにします。

B * mat[1][2];
于 2013-05-14T22:40:32.573 に答える
1

sizeof(A) < sizeof(B)の配列がAの配列と同等でない場合B。2 番目の割り当てでは、指し示すはずのものよりも大きな具象オブジェクトを割り当てるため*mat、2 番目の要素にアクセスすると、2 番目の要素にはアクセスせずB、最初の要素にスライスします。

Aとについてあまり教えてくれなかったので、とにかくそれが私の推測ですB

編集

あなたのコメントに答えるために、使用する生のポインターの量を制限することから始めます。代わりにベクトルのベクトルを使用してください。ベクトルの各要素は、 への生のポインタにすることができますABまたはのランタイム型を持つことができますC

#include <vector>

std::vector<std::vector<A*> > mat(1, std::vector<A*>(2, (A*)0));
于 2013-05-14T22:18:03.887 に答える