2012-02-16 12 views
0

私はC++で次のJavaコードを記述しようとしている:最初に2D配列をC++のスーパークラスに送信して、サブクラスを初期化しますか?

public class Block { 
    private int[][] block; 
    public Block(int[][] block) { 
     this.block = block; 
    } 
} 

public class Block1 extends Block { 
    public Block1() { 
     super(new int[][]{{2,3},{3,1}}); 
    } 
} 

あなたは、私はC++へのコードの私の翻訳が付属しているどこまで見ることができます下。基本的には、Blockを継承クラス(現在のところBlock1のみ)が2D配列としてそれらのデータを格納するのに役立つ一般的なクラスにします。これらの配列は、サブクラスのコンストラクタで直接初期化する必要があります。 しかし、私はBlock1で正常に動作するスーパーコールを取得することはできません、どのように私は2次元配列をパラメータとして送信するか、または正しく参照を再度格納する方法を知っていません。もしあなたが私にこれを見せることができれば素晴らしいだろう。

(私はクラスに後からより多くのメソッドを追加します - これは問題に関連した唯一の最も重要なものである。)

Block.h:

#ifndef BLOCK_H_ 
#define BLOCK_H_ 

namespace mtch { 

class Block { 
public: 
    Block(int _block[][2]); 
    virtual ~Block(); 
private: 
    int block[2][2]; 
}; 

} /* namespace mtch */ 
#endif /* BLOCK_H_ */ 

Block.cpp:

#include "Block.h" 

namespace mtch { 

Block::Block(int _block[][2]) { 
    block = _block; 
} 

} /* namespace mtch */ 

Block1.h:

#include "Block.h" 

#ifndef BLOCK1_H_ 
#define BLOCK1_H_ 

namespace mtch { 

class Block1 : public Block { 
public: 
    Block1(); 
    virtual ~Block1(); 
}; 

} /* namespace mtch */ 
#endif /* BLOCK1_H_ */ 

Block1.cpp:

#include "Block1.h" 

namespace mtch { 

Block1::Block1() : Block(new int[][]{{2,2},{2,3}}) { 
} 

} 

私はあなたが私がここで達成しようとしているものを理解してほしいです。 :P

答えて

0

ブロックは、定義したとおりに静的な配列です。単純に動的配列を割り当てて、正しいメモリ位置へのポインタを曲げることはできません。各要素をブロックにコピーする必要があります。最も簡単な方法は、ブロックとしてint [2] [2]の代わりにstd::vector<std::vector<int>>を使用することです。別の方法は、どこでも簡単な1次元配列を使用することです。 int *型のブロックを作成し、すべての関数をint *にすることもできます。次に、Block1()内の新しいint [4]とBlock1()の本体内のメモリを初期化することができます。また、静的配列の場合と同じように自動的には起こらないので、メモリを削除することを確認する必要があります。多次元配列は少しですicky

関連する問題