C ++:使用类型在变量中存储类的子代

时间:2010-10-30 11:02:41

标签: c++ delphi oop inheritance

我目前正在开发2D游戏项目,我想从Delphi切换到C ++。

在Delphi中,我可以声明一个具有类Entity类型的数组,我可以将Entity以及从Entity派生的类的对象放入它

这对我来说非常重要,因为在一个地方存储和管理所有实体似乎是合乎逻辑的。

  • 这在C ++中是否可行?
  • (为什么不在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?
}

我希望自己足够清楚,我真的很感谢你的帮助

4 个答案:

答案 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 ++模板。