プロが教えるわが家の防犯対策術!

基底クラスclass1と派生クラスclass2でnewを使って同じサイズの2次元配列pとqを作ったのですが、メモリ内の同じ場所を参照してるみたいで、class2の配列qで配列の中身を書き換えたら、class1の配列pの中身も書き換えられているんですが、対処法があれば教えてください。

class class1{
protected:
     int** p;
public:
    class1(int n)
    {
  int i;
       *p=new int[n];
       for(i=0;i<n;i++){
         p[i]=new int[2];
       }
     }
   :
   :
};
class class2 : public class1{
    int** q;
public:
    class2(int n)
    {
  int i;
       *q=new int[n];
       for(i=0;i<n;i++){
        q[i]=new int[2];
       }
}
   :
   :
};

A 回答 (2件)

最初にclass1::pとclass2::q(ポインタのポインタが指している先)がまだ不定なのにnew int[n]でアドレスをセットしているように見受けられますけど?


pとqの値(アドレス)によってはフリーズしちゃうと思います。

ためしてないけど。。。

この回答への補足

どうすればよいですか?

補足日時:2002/01/30 17:44
    • good
    • 0

こうだと思う。



class CClassA
{
protected:
int** p;
int _nCntA;

public:
CClassA( int n ) {
_nCntA = n;
p = new int*[ n ]; // ポインタ配列を確保
for( int ii = 0; ii < n; ii++ ){
p[ ii ] = new int[ _nCntA ];
}
}
// デストラクタは省略
};

class CClassB : public CClassA
{
protected:
int** q;

public:
CClassB( int n ) : CClassA( n ) {
q = new int*[ n ]; // ポインタ配列を確保
for( int ii = 0; ii < n; ii++ ){
q[ ii ] = new int[ 2 ];
}
}
// デストラクタは省略
};
    • good
    • 0
この回答へのお礼

できました。たすかりました。ありがとうございました。

お礼日時:2002/01/30 19:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!