在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这并不令人惊讶。现在,当我创建一个组件数组时,块的大小显然将是4(字节),这将无法容纳任何其他结构。
所以我的问题是,如何存储Components的松散列表(即可以存储从组件继承的任何类/结构的列表)?在Java中,这是非常简单的。当然,在C++中肯定有一种简单的方法可以做到这一点。
发布于 2013-04-18 11:26:00
允许您拥有指向子类对象的基类指针,即Component * sgn = new SceneGraphNode
因此,分配一个Component*数组(如果需要改变大小,则分配一个向量),并使每个入口点指向一个派生对象。
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);如果您更喜欢向量而不是数组,可以将数组版本替换为:
#include <vector>;
//...
std::vector<Component* > components;
components.push_back(new SceneGraphNode);
components.push_back(new Renderable);发布于 2013-04-18 11:24:49
您可以按如下方式存储它们
std::vector<Component *> components;
Component * c = new Health;
components.push_back( c );调用components[0] -> method();将调用Health的method()
这就是在C++中实现多态性的方式。
还要确保组件的method()为virtual
发布于 2013-04-18 11:25:32
您可以存储指向基类对象的智能指针的vector,然后可以向其中添加派生类的objects。
例如:
 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()) );https://stackoverflow.com/questions/16073912
复制相似问题