首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++是否在数组中存储任何子结构/类?

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

Stack Overflow用户
提问于 2013-04-18 11:20:16
回答 3查看 1.9K关注 0票数 2

在C++中,我定义了一系列结构...

代码语言:javascript
运行
复制
struct Component {};
struct SceneGraphNode : Component {};
struct Renderable : Component {};
struct Health : Component {};

这些很容易成为类,我被告知在C++中几乎没有什么不同。

在Java语言中,可以声明一个Component类型的数组,并将任何从(继承) Component扩展的类放入其中。Java认为它们都是组件,因为一切都使用智能指针,Java的“数组”实际上只是一组大小相同的智能指针。

然而,我知道Java处理数组与C++有很大的不同。当我检查每个结构的大小时,我得到了以下结果。

代码语言:javascript
运行
复制
Component                   // 4
SceneGraphNode : Component  // 8
Renderable : Component      // 8
Health : Component          // 20

这并不令人惊讶。现在,当我创建一个组件数组时,块的大小显然将是4(字节),这将无法容纳任何其他结构。

所以我的问题是,如何存储Components的松散列表(即可以存储从组件继承的任何类/结构的列表)?在Java中,这是非常简单的。当然,在C++中肯定有一种简单的方法可以做到这一点。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-18 11:26:00

允许您拥有指向子类对象的基类指针,即Component * sgn = new SceneGraphNode

因此,分配一个Component*数组(如果需要改变大小,则分配一个向量),并使每个入口点指向一个派生对象。

代码语言:javascript
运行
复制
Component * components[100];
components[0] = new SceneGraphNode;
components[1] = new Renderable;
// so on and so on

此外,对于要在子类中定义的任何成员函数,必须在组件中具有虚拟函数

代码语言:javascript
运行
复制
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使函数成为“纯虚拟的”,这意味着子类必须定义该方法。使用上面定义的数组...

代码语言:javascript
运行
复制
components[0]->method();
compenents[2]->method2(1);

如果您更喜欢向量而不是数组,可以将数组版本替换为:

代码语言:javascript
运行
复制
#include <vector>;
//...
std::vector<Component* > components;
components.push_back(new SceneGraphNode);
components.push_back(new Renderable);
票数 2
EN

Stack Overflow用户

发布于 2013-04-18 11:24:49

您可以按如下方式存储它们

代码语言:javascript
运行
复制
std::vector<Component *> components;
Component * c = new Health;
components.push_back( c );

调用components[0] -> method();将调用Healthmethod()

这就是在C++中实现多态性的方式。

还要确保组件的method()virtual

票数 1
EN

Stack Overflow用户

发布于 2013-04-18 11:25:32

您可以存储指向基类对象的智能指针的vector,然后可以向其中添加派生类的objects。

例如:

代码语言:javascript
运行
复制
 std::vector<std::unique_ptr<Component> > base;
 Component.push_back( std_unique_ptr<Component>(new SceneGraphNode()) ); 
            //^^use correct constructor, this example just show the methodology
 Component.push_back( std_unique_ptr<Component>(new Renderable()) );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16073912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档