C++小问题,希望人工答复,感谢
class TreeNode{private:
string value;
int count;
TreeNode *left;
TreeNode *right;
size_t *number;
public:
TreeNode():value(string()),count(int()),left(new TreeNode()),right(new TreeNode()),number(new size_t(1)){};
TreeNode(const TreeNode& tree):value(tree.value),count(tree.count),left(tree.left),right(tree.right),number(tree.number){++(*number);};
size_t getNumber(){return *number;}
TreeNode& operator=(const TreeNode& tree){
++*tree.number;
if(--*number == 0){
delete right;
delete left;
delete number;
}
value = tree.value;
count = tree.count;
left = tree.left;
right = tree.right;
number = tree.number;
return *this;
}
~TreeNode(){
if(--*number == 0){
delete right;
delete left;
delete number;
}
}
};
class BinStrTree
{
private:
TreeNode *root;
public:
BinStrTree():root(new TreeNode()){};
BinStrTree(const BinStrTree& bin):root(new TreeNode(*bin.root)) {++(root->getNumber);}为了让其的计数加一,这里为什么不可以,怎么修改?望人工答复
BinStrTree& operator=(const BinStrTree& bin){
TreeNode* new_root = new TreeNode(*bin.root);
delete root;
root = new_root;
return *this;
}
~BinStrTree();
};
BinStrTree::~BinStrTree()
{
delete root;
}
在`BinStrTree`的拷贝构造函数中,`++(root->getNumber);`这一行代码是错误的。因为`getNumber`是一个函数,而不是一个变量,所以我们应该调用它来获取`root`节点的计数值,并将其加一。
修改代码如下:
BinStrTree(const BinStrTree& bin) : root(new TreeNode(*bin.root)) {
++(root->getNumber());
}
同样,在`BinStrTree`的赋值运算符重载函数中,也需要对`root`节点的计数值进行更新。
修改代码如下:
BinStrTree& operator=(const BinStrTree& bin) {
TreeNode* new_root = new TreeNode(*bin.root);
delete root;
root = new_root;
++(root->getNumber());
return *this;
}
这样修改后,就能保证每次拷贝或赋值都能正确更新`root`节点的计数值了。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 注意到`root->getNumber`语句是错误的。`getNumber`是一个函数,但在这里并没有被调用,故要添加`()`使其被调用。然而,即使是`++(root->getNumber())`,依然会报错,因为 `getNumber`返回的是 `size_t` 类型的值(这是树中总节点数),这是一个临时变量,临时变量是不能被赋值的。
正确的方案应该是在复制构造函数中增加节点的使用计数。调用树节点的复制构造函数就会增加计数,所以复制构造函数如下:
BinStrTree(const BinStrTree& bin):root(new TreeNode(*bin.root)) {}
在这种情况下,创建一个新节点来复制 `bin.root`,由于使用了树节点的复制构造函数 `TreeNode(const TreeNode& tree)`,在复制构造函数中已经做了 `++*tree.number` 操作,所以不需要再额外增加计数。总的来说,复制构造一颗二叉树时,把树的根节点复制一份就可以了,无需手动增加计数。
这样写的目的是为了实现深拷贝,即完全复制出一颗新的、与原二叉树一模一样的二叉树,而且互不影响。在析构函数中,如果引用计数为0,会删除相应的资源。
有用请设置最佳答案{:10_254:}
页:
[1]