C++,找到父级并调用它的方法?

Posted

技术标签:

【中文标题】C++,找到父级并调用它的方法?【英文标题】:C++, finding parent and calling it's method? 【发布时间】:2017-08-30 22:20:15 【问题描述】:

我想说的是,我已经在这里寻找解决此问题的方法,但只是找不到我想要的东西。我的问题可能有一个简单的解决方案。

举个例子:

class Component

public:
    virtual ~Component()  // Make Polymorphic;

    void Update() ;
;
class UserMadeComponent : public Component

public:

    void Update() ;
;

int main()

    std::vector<Component*> _components;

    UserMadeComponent* UsersComponent = new UserMadeComponent;

    _components.push_back(UsersComponent);

    while (true)
    
        for (auto _comp = _components.begin(); _comp != _components.end(); _comp++)
        
            (*_comp)->Update();
        
    

现在程序员,使用这个框架,可以创建他们想要的任何类型的组件。他们会将其添加到分量向量中。我希望能够获取组件的类型并调用其 Update 方法。这是我想要完成的小图:

所以目标是调用“父母”更新方法。但是,用户可以创建他们想要的任何类型的组件。我不能假设这个数组中任何组件的类型。我希望这是有道理的

//编辑//

感谢人们帮助我理解虚拟方法调用。但是我怎么知道那个类实际上是什么。例如,用户创建了一个名为“Transform”的组件。我只想在组件数组中允许一个 Transform 实例。但是很明显,如果我只知道它是一个组件指针,我就无法检查这种情况。

很难解释,所以这里是另一张图片:

Link to image

【问题讨论】:

这里的虚函数怎么不适合你?另外,为什么下划线前缀?请不要那样做。 你不是已经调用了父级的更新“方法”吗? 【参考方案1】:

你在倒退。相反,创建一个名为do_update 的虚拟方法,您的派生类将覆盖该方法。父类的update 方法应该调用虚拟的do_update 方法,它会正确调度。

这就是标准库的工作方式...

【讨论】:

"这就是标准库的做法。" - 在哪里? 他根本没有倒退。从字面上看,这正是子类化的用途。 @Josh 鉴于问题不够明确,这很可能是正确的方法,因为它是您的方法。 他解释了预期的接口,以及他的实现示例代码以及如何在他的 main.js 中使用它。怎么不清楚? @Josh 像这样:“所以目标是调用“父母”更新方法”【参考方案2】:

使用虚方法。

家长:

virtual void Update();

如果您希望 Component 类是“纯虚拟的”,这意味着您必须对它进行子类化并且它只代表一个抽象/接口,您可以这样做:

virtual void Update() = 0;

如果你试图实例化一个组件对象,这将给你一个错误,你创建的子类对象只实现了所有纯虚方法。

编辑:

下面的代码检查 x 是否是一个变换。但是,这样做意味着您可能存在设计缺陷。为什么不制作一个语义感知容器来阻止用户添加两个转换呢?

dynamic_cast<Transform*>(x) == nullptr

【讨论】:

我现在有这个,它工作正常。但是我如何获得该类的类型,就像它被创建的那样。我已经延长了我的帖子 嗨@ReeceWard,通常你应该一次问一个问题。如果您还有其他问题,您应该标记一个正确答案并打开另一个问题。

以上是关于C++,找到父级并调用它的方法?的主要内容,如果未能解决你的问题,请参考以下文章

数据框:从单个 ID 中提取多个父级并计算出现次数

嵌套一个组件,需要从该组件获取一个属性值给父级并设置另一个

在Wordpress中检查页面的第一个父级并添加主体id

jQuery - 单击文件输入的父级并触发单击事件到文件输入后,它返回“太多的递归”

将 Xamarin 表单页面捕获为位图而不附加到父级

带有回调函数的 C++ 模板类