C++ 在数组中存储任何子结构/类?

标签 c++

在 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/

相关文章:

c++ - 在 C++ 中通过函数传递变量

c++ - 为什么我的字符串 vector 是空的

c++ - 将字符串转换为 char 和 int 数据类型

c++ - 从 C++ 调用组件中定义的 QML 函数

c++ - 为什么模板没有重新定义,为什么都写在头文件里了?

python - Cython 中的这个声明是什么? cdef PyObject ** worker 。它是指向指针的指针吗?

c++ - 静态数据成员的类内初始化

c++ - 如何将 Visual Studio 2005 的平台工具集添加到较新 IDE 版本的 `Platform Toolset` 列表中?

c++ - gdb:如何将共享库的日志文件重定向到 gdb 输出

c++ - vector 模板冲突声明