2012-04-27 32 views
0

私はC++とOOPを学んでおり、 "Pion"というクラスがあり、 "Chessboard"クラスがあり、 "Chessboard"クラスで宣言する必要がありますクラス "Pion"へのポインタの2次元配列を返し、それをNULLポインタに初期化します。C++クラスへのポインタの配列、nullに初期化するpionters

2d配列を宣言する方法は分かっていますが、NULLポインタに初期化する方法はありません。

2d配列の宣言は、次のようになります。 Pion * P [8] [8];

しかし、nullポインタ部分には設定されていません。

ヘルプ/ヒントをお待ちしております。

[EDIT]

すべての答え/ヒントのためのおかげで、私はまだ混乱しています。 Chessboardというクラスがあり、 "Pion"クラスにリンクするポインタの2次元配列を作成する必要があります。この配列はクラスメンバーでNULLポインタに初期化する必要があります。

ので、私は物事を試し試してみましたが、私は.H(ヘッダファイル)にこの

を作ってみた私は[[8]プライベートメンバクラス

パイ中間子* Pを宣言しました8]。

とconcstructor以内に私が置かれているこの

for (int x = 0; x < 8; ++x) { 
    for (int y = 0; y < 8; ++y) { 
     m_velden[x][y] = NULL; 
    } 
} 

これが動作しているようだが、私はこれが最善の解決策

+0

2D配列の反復処理についてどう思いますか?同じことをして、それらの項目をnullに設定してください。 –

答えて

4

Pがローカル変数かクラスメンバーかによって異なります。第一の場合 、あなたはChessboardコンストラクタで初期化リストでP()を使用し、第二の場合には宣言

Pion *P[8][8] = {}; 

の瞬間に、NULLへのすべての要素を初期化することができます。

+0

'P'がデータメンバーである場合、これは機能しません。 'P'がデータメンバであれば、' P() 'をクラスのコンストラクタのイニシャライザリストに追加する必要があります。 –

+0

@JamesMcNellis私は同意します。ポスターがクラスメンバーを必要とするかどうかは、その質問から明らかではありませんでした。 – Andrey

0

があるかどうかわからないんだけど、これを試してみてください:

for(int i = 0; i < 8; ++i) 
{ 
    for(int j = 0; j < 8; ++j) 
    { 
    P[i][j] = NULL; 
    } 
} 
2

いくつかの提案:最初に、多次元配列はC++の手間のかかるものではありません。おそらく単一次元配列を使い、行と列をとり、その論理位置の要素への参照を返す関数を書く方が良いでしょう。一次元配列は扱いが簡単です。

第2に、固定サイズのCスタイルの配列の代わりにstd::arrayを使用することをお勧めします。 std::arrayの使用に伴うオーバーヘッドはなく、多くのメリットがあります。

第3に、ダイナミックに割り当てられたオブジェクトの正しい所有権と有効期間管理を確実にするために、スマートポインタ(たとえば、std::unique_ptr<Pion>)を使用することを検討する必要があります。 (もちろん、ポインタを使用する必要があることを確認する必要があります。ポインタを避けて、値が配列にPionのオブジェクトを格納するだけで十分でしょう。特定のユースケースに依存します。特に、彼らは動的配列のサイズを調整するために非常に便利です、あるベクトルを検討する

class Chessboard 
{ 
    std::array<std::unique_ptr<Pion>, 64> _pions; 
}; 
0

別の方法:)心の中でこれら三つの提案を

、あなたはのようなもので終わるかもしれませんクラスの「配列」に役立ちます。

関連する問題