我有一个类和另一个类,其中第一个类类型为2d数组的类成员。 我需要一个返回该类成员的函数。
class Piece
{
// something is implemented here/
};
class Board
{
private:
Piece* _pieces[8][8];
public:
Piece*** getPieces()
{
return _pieces;
}
}
但那不起作用。
答案 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 =一个;