在c ++中返回2d指针数组

问题描述 投票:0回答:4

我有一个类和另一个类,其中第一类类型为2d数组的类成员。我需要一个返回该类成员的函数。

class Piece
{
    // something is implemented here/ 
};

class Board
{
private:
    Piece* _pieces[8][8];
public:
    Piece*** getPieces()
    {
       return _pieces;
    }
}

但那不起作用。

c++ arrays class 2d
4个回答
0
投票

这是我的类的快速版本,我允许传递2d数组。

class Board
{
private:
    Piece ** _pieces = new Piece*[8];
public:
    Board()
    {
        for(int i = 0; i<8; i++)
        _pieces[i] = new Piece[8];
    }
    Piece** getPieces()
    {
       return _pieces;
    }
    ~Board()
    {
        for(int i = 0; i<8; i++) delete [] _pieces[i];

        delete [] _pieces;
    }
};

0
投票

如果你有权访问C ++ 11/14/17,你可以使用std :: array来创建指针的二维数组,它比使用可以衰减到ptr的数组内置更加清晰和富有表现力。下面是一个如何创建Booard并将其返回到Pieces的8x8 2D指针数组的示例。

#include <array>
class Piece
{
// something is implemented here/ 
};
using Pieces=std::array<std::array<Piece*,8>,8>;
class Board
{
private:
Pieces _pieces;
public:
const Pieces& getPieces()
{
   return _pieces;
}
};

0
投票

正如@Galik在评论中所建议的那样,你应该在这里使用std :: arrays,因为大小是常量表达式。

标准并没有真正强制要求,但对于常见的实现,std::array<std::array<T,i>,j>确实有一个真正的T[i][j] 2D数组作为底层数据 - 换句话说,连续的行使用相邻的内存。另一方面,std::vector更像是一个指针数组,连续行的数据通常在内存中不相邻。

代码可能变成:

class Board
{
private:
    std::array<std::array<Piece*, 8>, 8> _pieces;
public:
    std::array<std::array<Piece*, 8>, 8>& getPieces()
    {
       return _pieces;
    }
}

但这仍然是糟糕的设计,因为它不必要地暴露了底层实现,所以你真的应该三思而后行应该是Board类的公共方法。


-1
投票

例如,int a [3] [6]; int ** p = a; // 这是不对的

您应该使用这样的指针:

int(* p)[6]; P = A;

© www.soinside.com 2019 - 2024. All rights reserved.