2016-05-30 2 views
0

У меня большая проблема, я хочу поместить матричный указатель объектов в функцию, но я не знаю, как это сделать, объекты, которые я использую, из производного класса. Это пример моего кода. Примечание: класс Кусок базовый класс и класс Queen является производным классом от КусокКак вернуть указатель на матрицу в 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

Прежде всего, я не понимаю зависимостей между Queen и Piece, поэтому я полагаю, что Piece супер-тип Queen и назначение Piece * mx = new Queen(); является правильным.

Чтобы исправить очевидную проблему несоответствия типов вы можете изменить ваш

void changeToQueen(Piece* mx) 

в

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

и с изменением Loops границу 7 (for (int i = 0; i < 7; i++)) или размера матрицы к 8 x 8 (с те же петли), это сработает.

Но мое предложение - подумать о методе хранения данных. Возможно, вам нужно будет построить матрицу размера, отличного от 7х7, поэтому рассмотрим следующий пример, где динамическая память используется для хранения матрицы (в данном примере используется только 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; 
} 

Примечание: & знак в 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++ 
} 

Так что, да, нет указателей почти нет забот;)

Вы все еще хотите указатели ?? uhm ... хорошо, может быть, вы могли бы это сделать: Piece *_pieces[rows][columns];, я не уверен, что вам это действительно нужно, но я не могу сказать, насколько это изменит ваш существующий код, чтобы сделать это.

Смежные вопросы