我有一个很大的问题,我想把一个对象的矩阵指针放到一个函数中,但我不知道怎么做,我使用它们的对象来自派生类。这是我的代码的一个例子。注意:class Piece是基类,类Queen是Piece
的派生类/storage/emulated/0/APPNAME/Video/
答案 0 :(得分:0)
首先,我不理解Queen
和Piece
之间的依赖关系,因此我认为Piece
是Queen
的超级类型,并且Piece * mx = new Queen();
是正确的。
要解决明显的类型不匹配问题,您可以更改
void changeToQueen(Piece* mx)
到
void changeToQueen(Piece* mx[7][7])
并且将循环边框更改为7(for (int i = 0; i < 7; i++)
)或矩阵大小为8 x 8
(具有相同的循环),这将起作用。
但我的建议是考虑存储数据的方法。
也许您需要构建大小不同于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;
}
注意:&
登录void changeToQueen(Queen*** &mx, int size)
允许更改函数Queen *** matrix;
内的指针changeToQueen
答案 1 :(得分: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)
将有助于将来。
答案 2 :(得分: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];
,我不确定你真的需要它,但我不知道它会修改你现有代码的程度。< / p>