2010-10-30 66 views
1

我目前正在一个2D游戏项目,我想从Delphi切换到C++。在Delphi中,我可以声明一个类型为Entity的数组,并且我可以将Entity以及从Entity派生的类的对象放入其中。C++:存储一个类的变量与它的类型的儿童

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

  • 这是可能的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? 
} 

我希望我使自己不够清楚,我真的很感激你的帮助

+0

我想起了一个问题:你有 - 要 - 切换到C++,还是要切换?如果前者是真的,我建议留在德尔福。你会遇到“赤裸裸的”C++的许多微妙之处,在这个问题中描述的C++是相当无害的。 C++是一个功能非常强大的语言,它具有许多令人惊叹的功能 - 但是,我很抱歉,只有熟练和有经验的专家才会使用它。我正在写这篇文章,作为在C++工作多年的工业软件开发人员,仍然没有停下来发现语言的后台...... – 2010-11-01 09:59:07

回答

5

使用boost::ptr_vector <实体>到存储多态对象,或智能指针的容器,例如矢量< boost :: shared_ptr <实体>>,如果你需要在别处共享/移动它们。

0

我想你正在寻找C++模板。

+3

模板将如何提供帮助? Fred想要存储两种不同类型的对象(通过继承关联)。 – 2010-10-30 11:17:36

5

...因为(没有更多修饰符),所有C++类型都是值类型,用Delphi或C#来讲。你基本上是这样做的:

point = camera; 

这个语句调用编译器生成的赋值运算符:

Entity& Entity::operator(const Entity& pOther) ... 

这工作,因为const Camera&可转换为const Entity&。但是在作业内部没有关于对象'Camera'部分的信息,pOther被“切片”为Entity对象。您告诉您要处理的对象引用类型(指针)的C++ compliler获取所需的行为:

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)); 
} 
1

你的问题是,你是混合的方式Delphi和C++处理的对象。

在C++中的情况下一个类的实例可以以三种方式使用:

  • 作为值
  • 作为参考
  • 作为指针

只有最后两个方式表达与您从Delphi代码期望的行为相同。

在你的榜样,你是创造价值的对象,这意味着,当你尝试将摄像机分配给一个实体,实体的子部分属于相机被复制,但没有别的。

你应该改变你的代码使用指针代替,

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的答案所示。