【问题标题】:C++ Accessing and Manipulating 2D Pointer Array from within get functionC++ 从 get 函数中访问和操作 2D 指针数组
【发布时间】:2014-05-13 22:25:29
【问题描述】:

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

但是我无法弄清楚 getShips 函数如何返回网格数组。 hits 数组只是布尔值,所以这很容易,但我对 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;
     }    
  }   

【问题讨论】:

  • 船舶不应该占用几个方格吗?您的代码中的某些内容不正确。如果你能提供更多关于它应该如何工作的细节,我很乐意给你一个答案。
  • 是的,我省略了放置船的代码,但基本上我为每艘船都有一个具有不同长度值的子类和一个用 Ship 指针填充数组中多个空格的函数,具体取决于在船舶长度上。放置算法已经过测试并且可以正常工作,但是要包含 Hits 数组和 Grid 数组,我必须重写并将它们都包含在 Board 类中,这就是这个问题出现的地方。
  • 如果有人想继续,或者想看看这部分代码适合整个程序的什么地方,整个代码可以在 pastebin 上找到:pastebin.com/sRS8k75y

标签: c++ arrays function class pointers


【解决方案1】:

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

【讨论】:

  • 我想他想用 get ship 函数归还所有船只。
【解决方案2】:

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

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&lt;std::array&lt;Ship*, 10&gt;, 10&gt; 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; }

【讨论】:

  • 我不确定强制 C++11 来做这么简单的事情是最好的方法。此外,它的可读性极低。
  • @muppetjones:比起Ship* (&amp;getShips())[10][10] { return grid; },我更喜欢C++11版本@
  • 我在我的代码中实现了这个版本的 Board 类。您能否给我一个示例,说明如何从其他函数中访问和操作网格数组?例如 board.getShips()[x][y]=nullptr;
  • @Spielen:这样使用它board.getShip(x, y) = nullptr;board.getShip(x, y)-&gt;Draw(); /* Assuming a Draw method for Ship */
【解决方案3】:

目前,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] 替换为 Ships 的单个数组。

getShips 函数将变为:

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

并且会被使用:

board.getShips()[x][y]

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-04
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 2010-12-17
    • 2022-01-24
    • 1970-01-01
    相关资源
    最近更新 更多