如何在c ++中返回矩阵指针?

时间:2016-05-30 05:37:28

标签: c++ function pointers matrix return

我有一个很大的问题,我想把一个对象的矩阵指针放到一个函数中,但我不知道怎么做,我使用它们的对象来自派生类。这是我的代码的一个例子。注意:class Piece是基类,类Queen是Piece

的派生类
/storage/emulated/0/APPNAME/Video/

3 个答案:

答案 0 :(得分:0)

首先,我不理解QueenPiece之间的依赖关系,因此我认为PieceQueen的超级类型,并且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>