鱼C论坛

 找回密码
 立即注册
查看: 1083|回复: 2

[已解决]C++小问题,希望人工答复,感谢

[复制链接]
发表于 2023-12-13 17:52:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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;
}
最佳答案
2023-12-13 18:47:59
注意到`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,会删除相应的资源。

有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-13 17:52:59 | 显示全部楼层
在`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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-13 18:47:59 | 显示全部楼层    本楼为最佳答案   
注意到`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,会删除相应的资源。

有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 05:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表