Pet*_*art 4 c++ tree copy-constructor
我一直在尝试为树提出一个复制构造函数.我找到了不少建议.
这个让我感兴趣.
class TreeNode
{
int ascii;
TreeNode* left;
TreeNode* right;
public:
TreeNode() { ascii = 0; left = right = 0; }
TreeNode* clone();
// ...
};
TreeNode* TreeNode::clone()
{
if (TreeNode* tmp = new TreeNode)
{
tmp->ascii = ascii;
if (left) tmp->left = left->clone();
if (right) tmp->right = right->clone();
return tmp;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
" if (TreeNode* tmp = new TreeNode)是什么意思?
除此之外它看起来还不错.它只是不能很好地工作.
知道它有什么问题吗?
上面的例子来自这个网站.
Tim*_*sch 10
好吧,对于初学者来说,它不是复制构造函数 - 复制构造函数在C++中具有非常明确的语法,因此正确的复制构造函数将具有原型TreeNode(TreeNode const &).只是为了使术语正确(编译器仍然会生成一个复制构造函数,因为它不知道该clone()函数应该做什么).
if语句中的表达式将分配一个新的TreeNode对象并声称检查分配是否成功(通过检查结果指针不是0).不幸的是,标准符合的预标准C++和现代C++实现将引发std::bad_alloc异常,因此测试将主要给用户一种温暖的模糊感觉,即即使不是,也会对内存分配失败做些什么.
为了使代码在符合标准的编译器上按预期工作,您必须使用nothrow new.从内存中,该行将读取如下内容:
if (TreeNode* tmp = new(std::nothrow) TreeNode)
Run Code Online (Sandbox Code Playgroud)
总而言之,除非TreeNode是依赖于clone()函数存在的对象层次结构的一部分,否则我将废除它并实现适当的C++构造函数.这样,编译器和你在复制对象时在同一页面上,而且其他程序员会发现它更容易遵循你的代码.
| 归档时间: |
|
| 查看次数: |
419 次 |
| 最近记录: |