2016-11-06 4 views
-1

私はC++でコーディングするのが初めてで、学校ではtictactoeゲームを作成する必要があります。私は親クラスのField(これは競技場であり、2次元データ配列で構成されている)とConsoleField(コンソール上で出力するための印刷メソッドを実装している)という子クラスを持っています。後でGuiFieldに別のクラスを追加して、同じゲームロジックを使用するが、別の印刷方法を使用できるように、これを行います。C++で親クラスの2次元配列を初期化すると、子クラスのポインタが不正になる

とにかく、私の問題は、子クラスのコンストラクタから親クラスのコンストラクタにプレーフィールドのサイズを渡し、2dのデータ配列を初期化することです。私は、コンストラクタの初期化リストを使って次のようにしてみました。

class ConsoleField : public Field { 

public: 
    ConsoleField(int size) : Field(size) 
    { 
    } 

    void print() = 0; 

}; 

class Field { 

protected: 
    int size; 
    int** data; 

public: 
    Field(int size):size(size) 
    { 
     int** data = new int*[size]; 
     for (int i = 0; i < size; i++) 
     { 
      data[i] = new int[size]; 
     } 

     for (int i = 0; i < size; i++) 
     { 
      for (int j = 0; j < size; j++) 
      { 
       data[i][j] = 0; 
      } 
     } 
    } 

    void print() {}; 

}; 

デバッグするとき、私は親クラスのコンストラクタは、私はそれがやりたいすべてを行い、それが子コンストラクタから取得し、また、データの2次元アレイとを初期化へのポインタを作成し、そのメンバ変数サイズ=サイズを設定することを見つけますしかし、子コンストラクタに戻るとき、子クラスのメンバ変数データは設定されず、そのポインタは0000000を返します。

親コンストラクタを使用して2次元配列を初期化する方法子クラスとデータ配列への有効なポインタを取得?

ありがとうございました。

答えて

2

int** data = new int*[size]; からint**一部を削除するあなたは、スタック上に新しい変数を作成したいが、これは、ローカル変数data、ないメンバ変数を初期化するクラスmemeber

+0

ああ、私はそれを得ます。ありがとうございました!私はかなりのコードを見て、それがどのように私の前を滑ったのかわからない。私はすでにそれを知っていたはずです。どうもありがとうございます! –

1
int** data = new int*[size]; 

を設定しないでください。

それは単に次のようになります。

data = new int*[size]; 
+0

ありがとう!私は今、私の誤りを見る。 –

関連する問題