Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回c+中的二维指针数组+;_C++_Arrays_Class_2d - Fatal编程技术网

C++ 返回c+中的二维指针数组+;

C++ 返回c+中的二维指针数组+;,c++,arrays,class,2d,C++,Arrays,Class,2d,我有一个类和另一个类,它们的类成员是第一个类类型的2d数组。 我需要一个返回该类成员的函数 class Piece { // something is implemented here/ }; class Board { private: Piece* _pieces[8][8]; public: Piece*** getPieces() { return _pieces; } } 但这不起作用。例如, INTA[3][6]; int*

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

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

class Board
{
private:
    Piece* _pieces[8][8];
public:
    Piece*** getPieces()
    {
       return _pieces;
    }
}
但这不起作用。

例如, INTA[3][6]; int**p=a;//这是错误的

您应该像这样使用指针:

int(*p)[6];
p=a

这是我制作的类的快速版本,允许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;
    }
};
课程板
{
私人:
件**件=新件*[8];
公众:
董事会()
{

对于(inti=0;i来说,如果可以访问C++11/14/17,可以使用std::array来创建指针的2D数组,这比使用衰减为ptr的内置数组更干净、更具表达力。 下面是一个示例,说明如何创建并从Booard返回指向碎片的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;
}
};
#包括
班级作品
{
//这里实施了一些措施/
};
使用片段=std::数组;
班级委员会
{
私人:
件(件),;
公众:
const-Pieces和getPieces()
{
退货(件);;
}
};

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

标准并没有真正强制要求它,但对于常见的实现,
std::array
确实有一个真正的
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;
    }
}
课程板
{
私人:
std::数组_块;
公众:
std::array&getPieces()
{
退货(件);;
}
}

但这仍然是一个糟糕的设计,因为它不必要地暴露了底层实现,所以您真的应该仔细考虑
Board
类的公共方法。

数组不是指针。无论哪种方式,即使尝试返回指向实例数据的非常量指针也是不明智的。enca的重大突破psulation..你并不真的想返回整个电路板,你需要像
bool is_king(square);
或actions
void move(square from,square to)这样的查询功能这对我来说有点像货物崇拜编程,为什么你一开始就声明它是私有的?只是为了让它再次公开?请考虑<代码> STD::数组x片段; >但是你的代码不存储2D数组指针到Opks> Tabe<代码>,如OP打算的。另一方面,这可能是OP所要求的,他是什么意思?lly needs是一个成员
pieces\u pieces[64];
并跳过getter。否则他将创建世界上最慢的国际象棋程序。