C++ C++;从get函数中访问和操作二维指针数组

C++ C++;从get函数中访问和操作二维指针数组,c++,arrays,function,class,pointers,C++,Arrays,Function,Class,Pointers,我正在为我的课程做一个战舰游戏,我在使用的一个类中遇到了一些关于get函数的问题。我的游戏的基本思想是创建一个名为grid的2D 10X10数组,用空指针填充以表示棋盘。我创建了两个类,Board和Ship。网格数组是Ship类型的,我使用了一种算法来随机填充数组中的Ship。我使用Board类访问网格数组和命中数组(用于跟踪命中) 但是,我无法理解getShips函数如何返回网格数组。命中数组只是布尔代数,所以这很容易,但是我在C++中不够熟练,使得GETFISS函数正确返回网格数组,这是一个

我正在为我的课程做一个战舰游戏,我在使用的一个类中遇到了一些关于get函数的问题。我的游戏的基本思想是创建一个名为grid的2D 10X10数组,用空指针填充以表示棋盘。我创建了两个类,Board和Ship。网格数组是Ship类型的,我使用了一种算法来随机填充数组中的Ship。我使用Board类访问网格数组和命中数组(用于跟踪命中)

但是,我无法理解getShips函数如何返回网格数组。命中数组只是布尔代数,所以这很容易,但是我在C++中不够熟练,使得GETFISS函数正确返回网格数组,这是一个船指针类型。我将非常感谢任何帮助

class Board
{

    private:

    Ship *grid[10][10];

    bool hits[10][10];

    public:
     // get functions

    Ship *getShips()
    { 
    return grid; 
    }

    bool getHits()
    {
    return hits;
    }
};
我还想知道是否可以通过调用
getShips
函数在其他函数中操纵数组。比如:

for (int x=0; x<10; x++)
  {
     for (int y=0; y<10; y++)
     {
       board.getShips()[x][y]=nullptr;
     }    
  }   
class Board
{
private:
    Ship *grid[10][10];
    bool hits[10][10];

public:
    Ship* getShip(int x, int y) const { return grid[x][y]; }
    Ship*& getShip(int x, int y) { return grid[x][y]; }

    bool getHit(int x, int y) const { return hits[x][y]; }
    bool& getHit(int x, int y) { return hits[x][y]; }
};

for(int x=0;xOk。首先我要修改getShips和getHits函数。要实现类似功能:

Ship *getShips(int x, int y){ return grid[x+y*10]; }
bool getHits(int x, int y){return hits[x+y*10];}
这样可以简化代码并避免一些错误。 当您像使用一样声明多维数组时

Ship *grid[10][10];

bool hits[10][10];
你基本上是在声明指向船只的指针


如果你在C++中写,我会尝试使用最少的指针。尝试使用STL容器。它们为你做自动内存管理,这可以节省你的时间。

< P>我建议把你的接口改为:

for (int x=0; x<10; x++)
  {
     for (int y=0; y<10; y++)
     {
       board.getShips()[x][y]=nullptr;
     }    
  }   
class Board
{
private:
    Ship *grid[10][10];
    bool hits[10][10];

public:
    Ship* getShip(int x, int y) const { return grid[x][y]; }
    Ship*& getShip(int x, int y) { return grid[x][y]; }

    bool getHit(int x, int y) const { return hits[x][y]; }
    bool& getHit(int x, int y) { return hits[x][y]; }
};
如果您真的想返回
grid
并点击
hits
,我建议使用
std::array grid;
(需要C++11),而不是
Ship*grid[10][10];
。 如果无法使用C++11,请返回到
std::vector

然后

private:
    std::array<std::array<Ship*, 10>, 10> grid;
public:
    const std::array<std::array<Ship*, 10>, 10>& getShips() const { return grid; }
    std::array<std::array<Ship*, 10>, 10>& getShips() { return grid; }
private:
阵列网格;
公众:
常量std::array&getShips()常量{return grid;}
std::array&getShips(){return grid;}

目前,getShips似乎正在返回整个10x10数组的
Ship*
——您需要更改
getShips
函数返回的内容:

Ship*** getShips() { ...
但是,我建议不要混合使用指针和数组。指针可能会很棘手,与数组结合可能会很难调试。相反,您可以使用所有指针:
Ship***grid;
并使用new进行初始化(我将把初始化留作练习,但这里有一个例子:)

实际上,
Ship
类最好存储其所在位置的索引,可能类似于:

class Ship
{
   public:
      <<member func>>

   private:
      int nspaces_;
      int start_[2];
      int end_[2];
}
并将用于:

board.getShips()[x][y]

或者…您可以添加一个
getShip(intx,inty)
方法。

船不是应该有几个正方形吗?你的代码中有些东西是不正确的。如果你能提供更多关于它应该如何工作的细节,我很乐意给你一个答案。是的,我省略了放置船的代码,但基本上我为每艘船都有一个子类,具有不同的长度值和一个填充的函数数组中的多个空格带有一个Ship指针,具体取决于船只的长度。放置算法经过测试并正常工作,但为了将Hits数组和Grid数组都包含在Board类中,我必须重写它们,并将它们都包含在Board类中,这就是问题出现的地方。如果有人想继续,或者想看看这个部分在哪里n个代码适合整个程序,整个代码在这里的pastebin上可用:我想他想使用get ships函数返回所有飞船。我不确定强制使用C++11来完成这样简单的任务是最好的方法。另外,它的可读性非常低。@muppetjones:我更喜欢C++11版本,而不是
Ship*(&getShips())[10][10]{return grid;}
我在我的代码中实现了这个版本的Board类。你能给我一个例子说明如何从其他函数中访问和操作网格数组吗?例如Board.getShips()[x][y]=nullptr;@Spielen:这样使用
Board.getShip(x,y)=nullptr;
Board.getShip(x,y)->Draw()/*假设船舶采用绘图方法*/