如您在以下代码中看到的,我尝试将一些函数“ initialize”的默认参数设为并集。如何更改函数“ initialize”的定义以使其与C ++ 11之前的C ++兼容?我需要向RedBlackPointer添加一些构造函数吗?如果是这样,怎么办?
template <typename T> class RedBlackNode{
protected:
union RedBlackPointer{
RedBlackNode *node;
struct{
unsigned value:1; // for color / other info
}flag;
}left, right, parent;
T key;
public:
void initialize(T key, RedBlackPointer left = {(RedBlackNode*)0},
RedBlackPointer right = {(RedBlackNode*)0},
RedBlackPointer parent = {(RedBlackNode*)0}){
this->key = key;
this->left = left; this->right = right;
this->parent = parent;
}
}
实际上,扩展的初始化列表在C ++ 11之前不可用。
只要记住在一个联盟中任何时候只有一个成员都可以处于活动状态,就可以使用默认构造函数轻松解决此问题:
template <typename T> class RedBlackNode{
protected:
union RedBlackPointer{
RedBlackPointer() : node(0) { } // <==== default constructor
RedBlackNode *node;
struct{
unsigned value:1; // for color / other info
}flag;
}left, right, parent;
T key;
public:
void initialize(T key, RedBlackPointer left = RedBlackPointer(), //refer to default ctor
RedBlackPointer right = RedBlackPointer(),
RedBlackPointer parent = RedBlackPointer()){
this->key = key;
this->left = left; this->right = right;
this->parent = parent;
}
void show() {
cout<<left.node<<","<<right.node<<","<<parent.node<<","<<key<<endl;
}
}; // <=== ;
这里是如何证明它有效的方法:
RedBlackNode<int> N;
N.initialize(5);
N.show();
附加评论:
一件事使我感到困惑:在您的联合中,您将指针与一个位标志组合在一起。
这本身并不是在推sho:可以想象,这是避免指针分配开销的一种技巧,当有时Poited的值足够小以直接存储在树中时。
但是,在这种情况下,尚不清楚如何知道活动成员(即何时使用指针,何时使用标志)。
因此,我建议您交叉检查此处是否有错误/遗漏的元素。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句