在 C++ 中,我定义了一系列结构......
struct Component {};
struct SceneGraphNode : Component {};
struct Renderable : Component {};
struct Health : Component {};
这些很容易成为类,我被告知在 C++ 中几乎没有什么区别。
在 Java 中,可以声明一个 Component
类型的数组,并将任何扩展自(继承)Component
的类放入其中。 Java 将它们视为所有组件,并且由于所有内容都使用智能指针,因此 Java 的“数组”实际上只是大小相同的智能指针的列表。
但是据我所知,Java 处理数组的方式与 C++ 显着不同。当我检查每个结构的大小时,我得到以下结果。
Component // 4
SceneGraphNode : Component // 8
Renderable : Component // 8
Health : Component // 20
这并不奇怪。现在,当我创建一个组件数组时, block 的大小显然将是 4(字节),它不会容纳任何其他结构。
所以我的问题是,如何存储 Components
的松散列表(即可以存储从 Component 继承的任何类/结构的列表)?在 Java 中,这非常简单。当然,C++ 中一定有一种简单的方法可以做到这一点。
最佳答案
你可以有一个指向子类对象的基类指针,即
Component * sgn = new SceneGraphNode
因此,分配一个 Component*
数组(如果需要改变大小,则分配一个 vector )并使每个入口指向派生对象。
Component * components[100];
components[0] = new SceneGraphNode;
components[1] = new Renderable;
// so on and so on
除此之外,您还必须在组件中为您打算在子类中定义的任何成员函数提供虚拟函数
class Component {
public:
virtual void method() = 0;
virtual int method2(int arg) = 0;
};
class SceneGraphNode : public Component {
public:
virtual void method(){
//body
}
virtual int method2(int arg){
return arg*2;
}
};
virtual
关键字使得在运行时它会查看所指向对象的实际类型并调用其方法,而不是调用指针类型的方法。这就是java正常做事的方式。 = 0
使函数成为“纯虚拟”,这意味着子类必须定义该方法。使用上面定义的数组...
components[0]->method();
compenents[2]->method2(1);
如果您更喜欢 vector 而不是数组,可以将数组版本替换为:
#include <vector>;
//...
std::vector<Component* > components;
components.push_back(new SceneGraphNode);
components.push_back(new Renderable);
关于C++ 在数组中存储任何子结构/类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16073912/