2017-03-08 5 views
0

1d配列の解決法しか見つけられませんでしたが、2d配列には適用できませんでした。 "ベクター"、 "テンプレート"、および "配列へのポインタ"が含まれています。C++コンストラクタのクラスメンバ配列の2次元配列サイズを設定する

私は動作するベクトルを得ることができますが、むしろ他の2つのどちらかを使用したいと思います。私は手動で破壊したくないのでポインタを使います。 (ポインターはコンストラクターで作成された配列にポイントされます)。

クラスには、screenという空の2次元配列が含まれています。コンストラクタはそのサイズを設定するはずです。私はあまりにも多くのことを試してみましたが、私はここにそれらをすべて列挙していますが、私が現在持っているものを示します。 (私が試した最後のものは、コンストラクタで作成された配列へのポインタであった。この場合、画面にはchar型のポインタだった)

は私が実装しなかった新しい表現で

Screen::Screen(const int w, const int h) : screen(new char[h][w]) {} { 
    width = w; 
    height = h; 
} 

配列サイズは一定でなければなりませんこれらの戦略のいずれかを実行し、それを動作させようと試みている間に多くの種類のエラーを受けました。どうすればこの問題を解決できますか? (主にテンプレートを使ってこれを行う方法を知りたい場合はコンストラクタで作成された配列へのポインタを使用することができません)

+1

ベクター、テンプレート、および配列へのポインタはどのように接続されています...とにかく、私はあなたの質問を理解していません。あなたが書いてみたいくつかの実際のコードを投稿すると、それに間違いがあることがわかります。 – DeiDei

+0

まずいくつかのコードを追加して、何を試してみてください。 – vsoftco

+0

'w'、' h'の値はすべてコンパイル時に認識されていますか? –

答えて

1

質問は少し曖昧でしたが、入力。 を編集しました。提供したコードに合わせて回答を変更しました。これは、高さと幅を指定して2次元の文字配列を作成します。

class Screen { 
    private: 
     char **data; 
     int rows; 
     int columns; 

    public: 
     Screen(int num_rows, int num_cols); 
}; 

Screen::Screen(int num_rows, int num_cols) { 
    data = new char * [num_rows]; 
    for (int i = 0; i < num_rows; ++i) { 
     data[i] = new char[num_cols]; 
    } 
    rows = num_rows; 
    columns = num_cols; 
} 

これは、空の2D配列の文字を作成します。

説明:cのすべての配列は、宣言した型のメモリ内の最初のブロックへのポインタに過ぎません。メンバ変数をダブルポインタとして持つことで、charポインタの配列が得られます。charポインタはそれぞれの配列の最初の値を指しています。

ただし、デストラクタを宣言することで、メモリリークを避けるためにデータ変数を解放する必要があります。

Screen::~Screen() { 
    for (int i = 0; i < rows; ++i) { 
     delete[] data[i]; 
    } 
    delete[] data; 
} 
+1

デストラクタで何かを解放するのを忘れました。 'delete [] data' –

+0

私はそれを指摘してくれてありがとう! – rhysvo

+0

これは大雑把なことであり、3つのルールに違反しています。このアプローチの代わりにベクトルまたはベクトルのベクトルを使用する必要があります –