c++ - 二维 vector ,重叠和数组中不同类型的对象

标签 c++ class vector multidimensional-array

我目前正在考虑如何为一种游戏板制作二维 vector 数组。

棋盘应该是 vector ,因为大小可以变化,每个“正方形”应该包含关于该正方形中有哪些对象的信息。

问题是对象可能重叠,对象可能不是同一类型或类。

这是我目前正在考虑的:(伪代码)

struct Square {
    vector<enum type>;
    vector<pointers to objects>;
};

vector< vector <Square> >;

指针将指向不同的 vector 数组,每个 vector 数组包含特定的对象。

我不确定如何实现这样的功能,或者这是否可能,我认真地认为这可能比它需要的更复杂......

有些对象必须是类,但我可以使游戏板类中的所有对象类型都继承自一个主类。但最终对象完全不同,所以我不确定这是否有意义的差异。

我是不是瞎了眼,错过了一种更简单的方法来做我想做的事情:二维数组包含不同类型的元素,这些元素也可以在数组中重叠?

我非常感谢任何帮助、摘要或见解。

注意事项: 创建后板的大小不会改变。 物体必须能够在棋盘上四处移动。

最佳答案

这是我的建议。

#include <boost/shared_ptr.hpp>

class GameObject {
  public:
    virtual ~GameObject() {}

    enum Type {
       FOO,
       BAR
    };
    virtual Type type() const = 0;

    virtual std::string name() const = 0;
    virtual void damaged() {}
};

class FooObject : public GameObject {
  public:
     Type type() const { return FOO; }

     std::string name() const { return "Foo object"; }
     void damaged() {
        std::cout << "Foo was damaged!" << std::endl;
     }
};

class BarObject : public GameObject {
  public:
     Type type() const { return BAR; }

     std::string name() const { return "Bar object"; }
     // Bar object doesn't respond to damage: no need to override damaged()
};

class Square {
   std::vector<boost::shared_ptr<GameObject> > objects;
};

class Board {
   // Details of the implementation here not important, but there
   // should be a class to hide them.

   Square* squares;
   int width, height;

   Board(int width, int height) :
     squares ( new Square[ width * height ] ),
     width ( width ),
     height ( height )
   {
   }

   ~Board() {
      delete [] squares;
    }

   Square& square(int x, int y) {
      if( x < 0 || x >= width || y < 0 || y >= height ) {
          throw std::logic_error( "accessed square out of bounds" );
      }
      return squares[ x + width * y ];
   }
};

总结:

  • 为可以放置在游戏板上的各种对象建立一个基类。
  • 这种类型的类必须有一个虚拟析构函数,即使它是微不足道的。这是因为您将通过 GameObject 指针删除内容。
  • 如果需要区分游戏对象,请使用返回“type”值的虚方法。
  • 只要没有需要使用它,就不要使用该类型值,而是使用其他做有意义事情的虚拟方法。使用类型值(然后通常转换为子类型)应该被视为最后的手段。例如(自由发明关于你的游戏的细节):
    • 每个对象都有一个名称,当您将光标放在它上面时会显示该名称。这在 name() 中返回。
    • 游戏中的事件可能会“损坏”一个对象。这仅适用于某些类型的对象,因此 damaged() 的默认操作是什么都不做。对损坏做出响应的 Foo 对象用实际操作覆盖它。
  • 无论您如何实现该板,请将您的确切实现隐藏在一个类中。 (不要把我的代码当作你不应该为此使用 vector<> 的指示,这绝对没问题。我个人稍微偏向于 vector< vector<>> 这里,但这也不是太糟糕。)
  • 为游戏对象使用共享指针。
    • Boost 具有出色且广泛使用的实现。
    • 如果您不能使用共享指针,请在 Square 类之外控制游戏对象的生命周期(例如,在 Board 类中所有游戏对象的主列表中),然后在 Square 类中使用原始指针。
    • 如果您确实使用了共享指针,而且这是您第一次使用,请先简要阅读一下。它们不是魔术,您需要注意某些事情,例如循环引用。
  • 根据您的需要,您可能希望在 GameObject 中有一个到正方形或正方形坐标的“反向链接”,其中包含指向该 GameObject 的指针。这将使您能够轻松地从板上移除对象并四处移动它们。

关于c++ - 二维 vector ,重叠和数组中不同类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15593131/

相关文章:

c++ - 使用 GDB 的 tui 选项

c++ - C++ 模板的别名?

c++ - 错误:从父类父类派生子类Son时基类未定义

c++ - 即使调用超出静态变量的范围,如何在lambda的主体中直接使用静态变量

c++ - 尝试在另一个类的头文件中使用对象,出现 “redefinition of class”错误

c++ - 如何管理多个文件、全局变量和定义

java - 从工厂请求元素,无需对每个案例进行硬编码

matlab - 如何在 MATLAB 中为此向量生成映射键?

java - 测量 2 个 vector 之间的相似度

c++ - 关于c++引用的问题