【问题标题】:Can I store subclass instances inside a superclass instance?我可以将子类实例存储在超类实例中吗?
【发布时间】:2020-11-14 08:16:41
【问题描述】:

我想用我的类创建一个树形结构,这样我就可以递归地更新一个对象和它的子对象。

我的第一个想法是在超类中添加一个变体列表,以便每个后续派生类也可以存储一个子类列表(从而形成树结构)。我尝试实现类似以下代码的内容,但在尝试将子类 A 和 B 添加到变体时不断出错。

是否可以在超类中存储子类?这甚至是正确的方法吗?

如果有修复代码的方法或其他获取功能的方法,请告诉我!

#include <iostream>
#include <list>
#include <variant>

class SubClassA;
class SubClassB;

//-------------------------------------

class SuperClass {
public:
    std::list<std::variant<SuperClass, SubClassA, SubClassB>> children;
    
    void update() {
        // do X
        updateChildren();
    }

protected:
    void updateChildren() {
        for (auto &varObj : children) {
            std::visit([](auto& child) {child.update(); }, varObject);
        }
    }
};
    
//-------------------------------------

class SubClassA : public SuperClass {
public:
    void update() {
        // do Y
        updateChildren();
    }
};
    
//-------------------------------------

class SubClassB : public SuperClass {
public:
    void update() {
        // do Z
        updateChildren();
    }
};

【问题讨论】:

    标签: c++ inheritance c++17 variant incomplete-type


    【解决方案1】:

    问题是updateChildren() 的定义出现得太早,在子类定义之前。因此,在需要完整类型的上下文中使用不完整类型。

    一种可能的解决方案是将SuperClass::updateChildren() 的定义放在最后:

    class SuperClass {
        // ...
        void updateChildren();  // declaration only
    };
        
    class SubClassA : public SuperClass {/* ... */};
    class SubClassB : public SuperClass {/* ... */};
    
    void SuperClass::updateChildren() {
        // ...
    }
    

    【讨论】:

      猜你喜欢
      • 2015-04-27
      • 2011-10-28
      • 1970-01-01
      • 2015-05-29
      • 2015-10-07
      • 2023-03-30
      • 2014-09-24
      • 2018-04-23
      • 2013-01-10
      相关资源
      最近更新 更多