Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 二维矢量,重叠和;数组中不同类型的对象_C++_Class_Vector_Multidimensional Array - Fatal编程技术网

C++ 二维矢量,重叠和;数组中不同类型的对象

C++ 二维矢量,重叠和;数组中不同类型的对象,c++,class,vector,multidimensional-array,C++,Class,Vector,Multidimensional Array,我目前正在考虑如何为一种游戏板制作2D向量阵列 电路板应该是矢量,因为大小可能不同,每个“正方形”应该包含关于该正方形中的对象的信息 问题是可能存在重叠的对象,并且这些对象可能不是相同的类型或类 这就是我目前正在考虑的:(伪代码) struct Square{ 矢量; 矢量; }; 向量; 指针指向不同的向量数组,每个数组包含特定的对象 我不确定如何实现这样的功能,或者这是否可能,我认真地认为这可能比它需要的更复杂 有些对象必须是类,但我可以使游戏板类中所有类型的对象都继承自一个主类。。但最终

我目前正在考虑如何为一种游戏板制作2D向量阵列

电路板应该是矢量,因为大小可能不同,每个“正方形”应该包含关于该正方形中的对象的信息

问题是可能存在重叠的对象,并且这些对象可能不是相同的类型或类

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

struct Square{
矢量;
矢量;
};
向量<向量>;
指针指向不同的向量数组,每个数组包含特定的对象

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

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

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

我真的非常感谢任何帮助,片段或见解

注: 创建后,板大小将不会改变。
对象必须能够在板中移动。

以下是我的建议

#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()常量=0;
虚拟std::string name()const=0;
虚拟空已损坏(){}
};
FooObject类:公共游戏对象{
公众:
Type Type()常量{return FOO;}
std::string name()常量{返回“Foo对象”;}
无效损坏(){
std::可以在这里,但也不太糟糕。)
  • 使用游戏对象的共享指针。
    • Boost有一个非常好且广泛使用的实现
    • 如果您不能使用共享指针,请在Square类之外控制游戏对象的生存期(例如,在Board类中所有游戏对象的主列表中),然后在Square类中使用原始指针
    • 如果你确实使用了共享指针,而且这是你第一次使用,请先简单阅读一下。它们不是魔法,你需要注意某些事情,比如循环引用
  • 根据您的需要,您可能希望在GameObject中有一个到方块的“反向链接”,或方块的坐标,其中包含指向该游戏对象的指针。这将允许您轻松地从棋盘上移除对象并移动它们

    • 以下是我的建议

      #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()常量=0;
      虚拟std::string name()const=0;
      虚拟空已损坏(){}
      };
      FooObject类:公共游戏对象{
      公众:
      Type Type()常量{return FOO;}
      std::string name()常量{返回“Foo对象”;}
      无效损坏(){
      std::可以在这里,但也不太糟糕。)
      
    • 使用游戏对象的共享指针。
      • Boost有一个非常好且广泛使用的实现
      • 如果您不能使用共享指针,请在Square类之外控制游戏对象的生存期(例如,在Board类中所有游戏对象的主列表中),然后在Square类中使用原始指针
      • 如果你确实使用了共享指针,而且这是你第一次使用,请先简单阅读一下。它们不是魔法,你需要注意某些事情,比如循环引用
    • 根据您的需要,您可能希望在GameObject中有一个到方块的“反向链接”,或方块的坐标,其中包含指向该游戏对象的指针。这将允许您轻松地从棋盘上移除对象并移动它们

    创建游戏板后,游戏板的大小是否可以更改,或者您的意思是需要不同大小的板?不,创建后游戏板的大小不会改变。创建游戏板后,游戏板的大小是否可以更改,或者您的意思是需要不同大小的板?不,游戏板大小在创建后不会发生变化。谢谢,我想我会这样做我的对象类。但我不确定董事会的建议。我没有真正提到它,但对象在地图中移动。我如何将对象从一个正方形移动到下一个正方形?如果我从一个正方形b移除指针,对象不会被删除吗在我将其添加到另一篇?用这些注释更新的第一篇文章之前。(我想你的意思是在这里使用智能指针,否则你几乎完全可以控制/负责删除。)当你从一个正方形中移除一个对象时,你会从正方形向量中的一个生成一个本地智能指针。然后你从向量中移除它,但该对象不会被删除,因为你仍然有一个本地智能指针。你可以将该指针插入另一个正方形的向量中,然后让本地智能指针超出范围。我想如果你没有如果我真的要写代码,你会发现你不需要做任何特殊的事情——这是做它的自然方式。很有趣。非常感谢,我想我可以从这里开始。谢谢,我想我会像那样做我的对象类。但我不确定董事会的建议。我没有真正提到它,但对象的运动在地图上四处移动。我该如何将一个对象从一个正方形移动到下一个正方形?如果我在将指针添加到另一个正方形之前从一个正方形中移除指针,该对象不会被删除吗?用这些注释更新了第一篇文章。(我想你的意思是在这里使用智能指针,否则你几乎完全可以控制/负责删除。)当你从一个正方形中移除一个对象时,你会从正方形向量中的一个生成一个本地智能指针