我目前正在开发2D游戏项目,我想从Delphi切换到C ++。
在Delphi中,我可以声明一个具有类Entity
类型的数组,我可以将Entity
以及从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?
}
我希望自己足够清楚,我真的很感谢你的帮助
答案 0 :(得分:5)
使用boost::ptr_vector&lt;实体&gt;存储多态对象或智能指针的容器,例如矢量&lt;提高:: shared_ptr的&LT;实体&GT; &gt ;,如果你需要在别处分享/移动它们。
答案 1 :(得分:5)
...因为(没有进一步的修饰符)所有C ++类型都是值类型,用Delphi或C#来表达。你基本上是这样做的:
point = camera;
此语句调用编译器生成的赋值运算符:
Entity& Entity::operator(const Entity& pOther) ...
这是有效的,因为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) );
}
答案 2 :(得分:1)
你的问题是你正在混合Delphi和C ++处理对象的方式。
在C ++案例中,可以通过三种方式使用类实例:
只有最后两种方式表达了与Delphi代码相同的行为。
在您的示例中,您正在创建值对象,这意味着当您尝试将Camera分配给实体时,属于Camera的Entity的子部分将被复制,但不会复制任何其他内容。
您应该更改代码以改为使用指针,
int main()
{
Entity* point = new Entity;
Camera* camera = new Camera;
vector<Entity*> vec;
vec.push_back( point );
vec.push_back( camera );
// don't forget to delete them, when you're done with the list
for (vector<Entity*>::iterator iter = vec.begin(); iter != vec.end(); ++iter)
delete (*iter);
}
enter code here
为了避免直接搞乱指针,更现代的C ++习语就是使用智能指针。正如paul_71的答案所示。
答案 3 :(得分:0)
我猜你正在寻找C ++模板。