我可以将子类实例存储在超类实例中吗?
Can I store subclass instances inside a superclass instance?
我想用我的 classes 创建一个树结构,这样我就可以递归地更新一个对象,然后更新它的子对象。
我的第一个想法是在superclass中加入一个variant list,这样每一个后续派生的class也可以存储一个children的list(从而形成树结构)。我尝试实现类似于以下代码的内容,但在尝试将 Subclass A 和 B 添加到变体时不断出现错误。
是否可以在超级class中存储子classes?这是正确的方法吗?
如果有修复代码的方法或其他获得功能的方法,请告诉我!
#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();
}
};
问题是 updateChildren()
的定义出现得太早,在定义子类之前。因此,在需要完整类型的上下文中使用不完整类型。
一个可能的解决方案是将 SuperClass::updateChildren()
的定义放在最后:
class SuperClass {
// ...
void updateChildren(); // declaration only
};
class SubClassA : public SuperClass {/* ... */};
class SubClassB : public SuperClass {/* ... */};
void SuperClass::updateChildren() {
// ...
}
我想用我的 classes 创建一个树结构,这样我就可以递归地更新一个对象,然后更新它的子对象。
我的第一个想法是在superclass中加入一个variant list,这样每一个后续派生的class也可以存储一个children的list(从而形成树结构)。我尝试实现类似于以下代码的内容,但在尝试将 Subclass A 和 B 添加到变体时不断出现错误。
是否可以在超级class中存储子classes?这是正确的方法吗?
如果有修复代码的方法或其他获得功能的方法,请告诉我!
#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();
}
};
问题是 updateChildren()
的定义出现得太早,在定义子类之前。因此,在需要完整类型的上下文中使用不完整类型。
一个可能的解决方案是将 SuperClass::updateChildren()
的定义放在最后:
class SuperClass {
// ...
void updateChildren(); // declaration only
};
class SubClassA : public SuperClass {/* ... */};
class SubClassB : public SuperClass {/* ... */};
void SuperClass::updateChildren() {
// ...
}