我可以为联合的C函数设置默认参数
发布时间:2020-12-16 07:11:17 所属栏目:百科 来源:网络整理
导读:正如您在下面的代码中看到的,我尝试使用函数“initialize”的一些默认参数作为union.如何更改函数“initialize”的定义以使其与C 11之前的C兼容?我是否需要向RedBlackPointer添加一些构造函数?如果是这样,怎么样? template typename T class RedBlackNode
正如您在下面的代码中看到的,我尝试使用函数“initialize”的一些默认参数作为union.如何更改函数“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,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(); 这里有一个live demo和with a compiler拒绝了您的初始代码. 附加评论: 有一件事让我感到困惑:在你的联盟中,你将指针与一位标志结合起来. 这本身并不是在喋喋不休:它可以想象它是避免指针分配开销的一种技巧,有时候poitned的值足够小,可以直接存储在树中. 但是在这种情况下,不清楚你将如何知道它是活动成员(即何时使用指针,以及何时使用该标志). 所以我建议你仔细检查这里没有错误/遗忘元素. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |