2016-05-30 6 views
0

私は大きな問題を抱えていますが、オブジェクトの行列ポインタを関数に追加したいのですが、どのようにこれを行うことができないのですか?私が使用するオブジェクトは派生クラスのものです。これは私のコードの例です。注意:クラスのワンピースは、基底クラスとクラスの女王は、派生クラスですワンピースからどのようにC++で行列ポインタを返すことができますか?

#include "Queen.h" 

void changeToQueen(Piece* mx) 
{ 
    for (int i = 0; i < 8; i++) 
    { 
     for (int j = 0; j < 8; j++) 
     { 
      mx[i][j] = new Queen(); 
     } 
    } 

} 
int main() 
{ 
    Piece * matrix[7][7]; 
    changeToQueen(matrix); // this fails 
    return 0; 
} 
+1

'void changeToQueen(Piece * mx [7] [7])' –

+2

ループ条件で判断すると、 'Piece * matrix [8] [8];'が必要です。 –

+0

あなたはメモリリークを持っています –

答えて

0

入力引数をvoid changeToQueen(Piece * mx[7][7])に変更することができます。

また、入力引数をvoid changeToQueen(Piece** mx)に変更することもできます。多次元配列素子をメモリに連続して格納されているので、両方の仕事である理由をmx[7*i + j] = new Queen();に代入演算子を変更し、入力として、最初の要素でchangeToQueen(&(matrix[0][0]));

を通過 。だからあなたが必要とするのは、最初の要素へのポインタです。

マトリクスの寸法を変更する必要がある場合は、コードを少し変更する必要があるため、どちらのソリューションにも問題があります。プロトタイプをvoid changeToQueen(Piece** mx, size_t width, size_t height)に変更すると、将来的に役立ちます。

0

まず第一に、私はQueenPiece間の依存関係を理解し​​ていないので、私はPieceQueenのスーパータイプであると仮定し、割り当てPiece * mx = new Queen();が正しいです。型の不一致の明白な問題を解決するには

あなたは

void changeToQueen(Piece* mx[7][7]) 

8 x 8に7(for (int i = 0; i < 7; i++))またはマトリックスのサイズにループの境界線を変更して(とにご

void changeToQueen(Piece* mx) 

を変更することができます同じループ)これは動作します。

しかし私の提案は、データを格納する方法を考えることです。 おそらく、あなたは7x7の異なるサイズの行列を構築する必要があるので、(この例では唯一のQueenが使用されている)動的メモリが行列を格納するために使用され、次の例を考えます:

void changeToQueen(Queen*** &mx, int size) 
{ 
    mx = new Queen**[size]; // allocation of memory for pointers of the first level 
    for (int i = 0; i < size; i++) 
    { 
     mx[i] = new Queen*[size]; // allocation of memory for pointers of the second level 
     for (int j = 0; j < size; j++) 
     { 
      mx[i][j] = new Queen(); // allocation of memory for object 
     } 
    } 
} 

int main() 
{ 
    int m_size = 7; 
    Queen *** matrix = NULL; // now memory not allocated for matrix 

    changeToQueen(matrix, m_size); 

    return 0; 
} 

注:&看板in void changeToQueen(Queen*** &mx, int size)関数内のポインタQueen *** matrix;を変更できるようにするchangeToQueen

0

また、これはそう

template <unsigned int rows, unsigned int columns> 
class Board 
{ 
    public: 
     Board() {} 

     void changeToQueen() 
     { 
      for (unsigned int y = 0 ; y < rows ; ++y) 
      { 
       for (unsigned int x = 0 ; x < columns ; ++x) 
       { _pieces[y][x] = Queen(); } 
      } 
     } 

     Piece &at(unsigned int row, unsigned int column) 
     { return _pieces[row][column]; } // you should check for out of range 
     // you could either have a default null value for Piece to return, or throw an exception 

    private: 
     Piece _pieces[rows][columns]; 
}; 

int main() 
{ 
    Board<8,8> board; 

    board.changeToQueen(); 
    // return 0; // this is not mandatory in c++ 
} 

物事を処理する方法、ええ、ないポインタほとんど心配である可能性があります。)

あなたはまだポインタをしたいです?うーん...おそらくあなたはそれを行うことができます:Piece *_pieces[rows][columns];、私はあなたが本当にそれを必要としているかどうかはわかりませんが、私はそれを行うためにあなたの既存のコードを変更する方法を伝えることはできません。

関連する問題