我正在用C++做学校作业(我仍在学习)。我正在尝试使用shared_ptr在多个位置存储Node的信息来实现随机生成的二叉树结构(我需要用于家庭作业)。考虑以下示例代码(这是我的小测试程序):

#include <vector>
#include <memory>


struct Node : public std::enable_shared_from_this<Node> {
    char charValue;
    int intValue;
    std::shared_ptr<Node > left;
    std::shared_ptr<Node > right;
    std::shared_ptr<Node > parent;

    std::shared_ptr<Node> getPtr()
    {
        return shared_from_this();
    }

    Node() : intValue(0)
    {
        charValue = 0;
    }
};

int main(int argc, char**argv) {

    std::vector<std::shared_ptr<Node>> treeQueue;
    std::shared_ptr<Node> root = std::make_shared<Node>();

    treeQueue.clear();
    treeQueue.push_back(root->left);  //std::shared_ptr<Node>(root->left)); //root->left->getPtr());
    treeQueue.push_back(root->right);  //std::shared_ptr<Node>(root->right)); //root->right->getPtr());

    treeQueue[1] = std::make_shared<Node>(); //std::shared_ptr<Node>(new Node);
    system("PAUSE");

    return 0;
}

在这种情况下,我会初始化一个根,并且我希望树的所有其他节点都保持为空,直到在树结构中选择它为止。在我的作业中,我决定将其推入 vector treeQueue中后要选择哪个Node。 (我从那里随机选择)。

问题:例如,在上面的代码中,当我初始化treeQueue [1]时,我希望root-> right也会被初始化。因为它们是相同的指针。但它仍然是空的!我还将尝试将其推送到treeQueue的其他方式(也没有用)。我也尝试过“enable_shared_from_this”,这就是它在那里的原因。

有没有办法做到这一点?还是有另一种技术可以提供我所需的相同功能?

我了解到使用原始指针是不健康的,所以我使用了shared_ptr,这很有意义,但是现在我遇到了这个问题。请帮助我,我会失去理智的。我到处搜寻。我尝试了所有发现的东西。

最佳答案

shared_ptr共享ptr指向的内容。 shared_ptr本身不以任何方式,形状,物质或形式“共享”。引用相同对象(正在共享)的每个shared_ptr是其自己的单独的离散共享指针。

在这里,您将一个shared_ptr复制到了另一个shared_ptr。然后,您用另一个新构建的shared_ptr替换了shared_ptr的副本。

新构造的shared_ptr与第一个(从中复制的)原始shared_ptr引用无关。

您的代码等效于以下内容:

int *a=NULL;

int *b=a;

b=new int{4};

您现在期望*a返回4吗?当然不是。它们是两个完全不同的指针。

07-27 19:46