i你哟 发表于 2023-12-13 17:52:38

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;
}

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

sfqxx 发表于 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,会删除相应的资源。

有用请设置最佳答案{:10_254:}
页: [1]
查看完整版本: C++小问题,希望人工答复,感谢