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

时间:2017-12-18 12:01:47

标签: c++ arrays class 2d

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

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

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

但那不起作用。

4 个答案:

答案 0 :(得分:0)

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

Program www

 implicit none
 integer ::i,j,rows,cols,row
 real(kind=8) ::x,y,z
 real(kind=8),allocatable::mat(:,:),xrange(:),yrange(:)
 real(kind=8),allocatable::pot_bar(:,:),acc_bar_x(:,:),acc_bar_y(:,:)
 real(kind=8),allocatable::pot_sph(:,:),acc_sph_x(:,:),acc_sph_y(:,:)
 rows=2250000
 cols=8
 row=1500
 allocate(mat(cols,rows))
 allocate(xrange(row),yrange(row),pot_bar(row,row))
 allocate(acc_bar_x(row,row),acc_bar_y(row,row))
 allocate(pot_sph(row,row),acc_sph_x(row,row),acc_sph_y(row,row))
 open(24,file='pot.txt',status='old',form='Formatted', access='SEQUENTIAL')
 do i=1,rows,1
    read(24,*)mat(:,i)
 enddo
 close(24)
 do i=1,rows,row
    xrange(i)=mat(1,i)
 enddo
 do i=1,row,1
    yrange(i)=mat(2,i)
 enddo
 do i=1,row,1
    do j=1,row,1
       pot_bar(j,i)=mat(3,j+(i-1)*1500)
       acc_bar_x(j,i)=mat(4,j+(i-1)*1500)
       acc_bar_y(j,i)=mat(5,j+(i-1)*1500)
       pot_sph(j,i)=mat(6,j+(i-1)*1500)
       acc_sph_x(j,i)=mat(7,j+(i-1)*1500)
       acc_sph_x(j,i)=mat(8,j+(i-1)*1500)
    enddo
 enddo
 print*,xrange
 print*,yrange
end Program www

答案 1 :(得分:0)

如果你有权访问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;
}
};

答案 2 :(得分: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类的公共方法。

答案 3 :(得分:-1)

例如,

int a [3] [6]; int ** p = a; //它错了

你应该使用这样的指针:

int(* p)[6]; P =一个;