【发布时间】:2011-10-29 12:19:05
【问题描述】:
我正在编写一个树结构,我想将不同的数据存储在叶节点到分支节点中。这个想法与动态编程方法非常相似——聚合数据存储在分支中。因此我想出了(为简单起见减少了)
template<class L, class B> class node {
public:
virtual ~node() {}
// [...] visitor stuff
};
template<class L, class B> class branch : public node<L,B> {
public:
template<class It>
branch(It b, It e) {
// Do something with the iterators;
// decide if to create branches or leaves
// Create the branch data
b_ = new B(/* Unknown */);
}
~branch() { delete b_; delete child_[0]; delete child_[1]; }
private:
B* b_; node<L,B>* child_[2];
};
template<class L, class B> class leaf : public node<L,B> {
public:
leaf(L* l) : l_(l) {}
~leaf() {}
private:
L* l_;
};
以L 和B 结构为例
struct myleaf { int x; };
struct mybranch {
mybranch(/* Unknown */) {
// Apply a visitor to the child nodes to get sumx
}
int sumx;
// Some other properties
};
我的问题是如何在不遇到 B 的循环依赖的情况下做到这一点,具体取决于 node<L,B>。或者,我可以轻松地重新构建代码以完全避免这个问题吗?
【问题讨论】:
-
公共继承模型“is-a”。因此,您说分支是节点。我认为这是您设计中非常基本的问题,它使它变得复杂。
标签: c++ templates tree circular-dependency