C ++从get函数中访问和操作2D指针数组

时间:2014-04-02 14:35:17

标签: c++ arrays function class pointers

我正在为我的课程制作战舰游戏,我在其中一个类中使用get函数遇到了一些问题。我的游戏的基本思想是创建一个2D 10X10阵列,称为网格,填充空指针来表示板。我创建了2个类,Board和Ship。网格数组是Ship类型,我使用算法随机填充数组。我使用Board类访问网格数组和命中数组(我用它来跟踪命中)。

但是我无法弄清楚getShips函数如何返回网格数组。命中数组只是布尔值,所以这很容易,但我对C ++的熟练程度不足以使getShips函数正确返回网格数组,这是一个Ship指针类型。我非常感谢任何帮助。

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;
     }    
  }   

3 个答案:

答案 0 :(得分:0)

确定。首先,我将修改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容器代替。他们为您进行自动内存管理,这可以为您节省一些时间。

答案 1 :(得分:0)

我建议将您的界面更改为:

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]; }
};

如果您确实想要返回gridhits,建议您使用std::array<std::array<Ship*, 10>, 10> 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; }

答案 2 :(得分:0)

目前,看起来getShips正在返回Ship*的整个10x10数组 - 您需要更改getShips函数返回的内容:

Ship*** getShips() { ...

但是,我建议不要混合使用指针和数组。指针可能很棘手,与数组结合可能很难调试。相反,您可以使用所有指针:Ship ***grid;并使用new初始化(我将初始化作为练习,但这是一个有示例的网站:http://pleasemakeanote.blogspot.com/2010/07/2d-arrays-in-c-using-new.html)。

实际上,Ship类可能更好地存储它存在的索引,可能是这样的:

class Ship
{
   public:
      <<member func>>

   private:
      int nspaces_;
      int start_[2];
      int end_[2];
}

存储起始索引和找到发货的最终索引的位置。您需要处理代码以识别它们之间的空间,但这是微不足道的。此设置允许您将Ship *grid[10][10]替换为Ship s。

的单个数组

getShips函数将成为:

...
Ship ships_[<<number of ships>>];
Ship *getShips()
{
   return ships_;
}
...

将被使用:

board.getShips()[x][y]

或者......您可以添加getShip(int x, int y)方法。