- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个树类,其中包含数据成员和对子数据进行操作的成员函数:
class Tree {
// variables, member functions here
Tree *parent;
std::vector<Tree*> children;
public:
Tree(Tree* parent, int par0 /*, other constructor parameters*/) {
//....
this->parent = parent;
for (int n = 0; n < par0; n++)
children.push_back(new Tree(this, /*other arguments*/));
//...
}
void method() {
for (auto node: children)
node->method();
if (children.size() == 0) {
// Code for leaf nodes
} else {
// Code for internal nodes
}
}
};
Tree 构造函数创建树结构,根据参数分配和初始化每个节点。
我想向类中添加新的数据和函数,产生新类 ExtTree
,它可以访问 Tree
的所有数据和函数,并共享尽可能多的代码。但是,在 ExtTree
中, parent 和 child 都应该是 (ExtTree*)
而不是 (Tree*)
。我如何重新组织此代码,以便 ExtTree 只添加自己的新数据,并返回到 Tree 以使用旧方法?
4 年前有人问过相关问题 here ,但我无法根据其中的答案找出解决方案;特别是,ExtTree 如何调用基础构造函数,或者它如何访问 Tree::method()
。
最佳答案
通过将整个事物转换为模板,您将获得最佳、类型最安全的结果。
有可能提出一个非基于模板的解决方案,但我认为它不会是最佳的。我建议使用基于模板的解决方案,但如果出于某种原因,模板无法解决问题,您可以使用以下方法获得可接受的结果:
A) 定义一个虚方法:ExtTree *get_extree()
。 Tree::get_extree()
返回 nullptr
或抛出异常(由您决定,以最适合您的应用程序为准)。 ExtTree::get_extree()
返回 this
。
B) 定义另一个名为 create_node()
的虚拟方法。 Tree::create_node()
执行new Tree(/* 转发参数*/)
,ExtTree::create_node()
执行 new ExtTree(/* 转发参数 */)
.
C) 将所有现有的 new Tree
调用替换为对 create_node()
的调用。
D) 以及任何其他需要同时使用 Tree
和 ExtTree
的常见代码放置原因将使用 get_extree()
来弄清楚它在做什么。
这将或多或少地带您到达您想去的地方。 A) 在概念上与仅使用 dynamic_cast
() 略有不同,使用 dynamic_cast
代替 get_extree
( ).但有时您会遇到对 dynamic_cast
过敏的人,这是避免过敏的一种方法。
我认为这里没有真正完美的、100% 干净的、非基于模板的解决方案。通过创建更多的虚拟方法并将几乎所有内容实现为虚拟方法,可能会在这里获得 100% 类型安全的解决方案。
但是,我认为这将需要大量工作。这就是模板的真正用途。使用它们。
关于c++ - 如何从基树类派生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35882383/
我是一名优秀的程序员,十分优秀!