我目前正在开发2D游戏项目,我想从Delphi切换到C++.
在Delphi中,我可以声明一个具有类类型的数组Entity,并且我可以将Entitys以及派生自Entity它的类的对象放入其中.
这对我来说非常重要,因为在一个地方存储和管理所有实体似乎是合乎逻辑的.
(为什么不在Delphi?)
我有什么其他选择来实现类似的东西?
我需要做以下的事情:
#include <vector>
using namespace std;
class Entity
{
public:
int id;
};
class Camera : Entity
{
public:
int speed;
};
int main()
{
Entity point;
Camera camera;
vector<Entity> vec;
vec.push_back( point );
vec.push_back( camera ); //Why can't I do that?
}
Run Code Online (Sandbox Code Playgroud)
我希望自己足够清楚,我真的很感激你的帮助
小智 5
使用boost :: ptr_vector <Entity>来存储多态对象,或智能指针的容器,例如vector <boost :: shared_ptr <Entity >>,如果你需要在别处共享/移动它们.
...因为(没有进一步的修饰符)所有C++类型都是值类型,用Delphi或C#来表达.你基本上是这样做的:
point = camera;
Run Code Online (Sandbox Code Playgroud)
该语句调用编译器生成的赋值运算符:
Entity& Entity::operator(const Entity& pOther) ...
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为const Camera&可转换为const Entity&.但是在赋值中,没有关于Camera对象部分的信息,pOther将'切片'转化为Entity对象.通过告诉C++编译器您希望将对象视为引用类型(指针)来获得所需的行为:
int main()
{
vector<std::shared_ptr<Entity> > vec;
vec.push_back( std::shared_ptr<Entity>(new Point) );
vec.push_back( std::shared_ptr<Entity>(new Camera) );
}
Run Code Online (Sandbox Code Playgroud)