C++ 二维矢量,重叠和;数组中不同类型的对象
我目前正在考虑如何为一种游戏板制作2D向量阵列 电路板应该是矢量,因为大小可能不同,每个“正方形”应该包含关于该正方形中的对象的信息 问题是可能存在重叠的对象,并且这些对象可能不是相同的类型或类 这就是我目前正在考虑的:(伪代码)C++ 二维矢量,重叠和;数组中不同类型的对象,c++,class,vector,multidimensional-array,C++,Class,Vector,Multidimensional Array,我目前正在考虑如何为一种游戏板制作2D向量阵列 电路板应该是矢量,因为大小可能不同,每个“正方形”应该包含关于该正方形中的对象的信息 问题是可能存在重叠的对象,并且这些对象可能不是相同的类型或类 这就是我目前正在考虑的:(伪代码) struct Square{ 矢量; 矢量; }; 向量; 指针指向不同的向量数组,每个数组包含特定的对象 我不确定如何实现这样的功能,或者这是否可能,我认真地认为这可能比它需要的更复杂 有些对象必须是类,但我可以使游戏板类中所有类型的对象都继承自一个主类。。但最终
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移除指针,对象不会被删除吗在我将其添加到另一篇?用这些注释更新的第一篇文章之前。(我想你的意思是在这里使用智能指针,否则你几乎完全可以控制/负责删除。)当你从一个正方形中移除一个对象时,你会从正方形向量中的一个生成一个本地智能指针。然后你从向量中移除它,但该对象不会被删除,因为你仍然有一个本地智能指针。你可以将该指针插入另一个正方形的向量中,然后让本地智能指针超出范围。我想如果你没有如果我真的要写代码,你会发现你不需要做任何特殊的事情——这是做它的自然方式。很有趣。非常感谢,我想我可以从这里开始。谢谢,我想我会像那样做我的对象类。但我不确定董事会的建议。我没有真正提到它,但对象的运动在地图上四处移动。我该如何将一个对象从一个正方形移动到下一个正方形?如果我在将指针添加到另一个正方形之前从一个正方形中移除指针,该对象不会被删除吗?用这些注释更新了第一篇文章。(我想你的意思是在这里使用智能指针,否则你几乎完全可以控制/负责删除。)当你从一个正方形中移除一个对象时,你会从正方形向量中的一个生成一个本地智能指针