返回共享指针,二叉树C ++ 11,

时间:2016-11-13 19:59:32

标签: c++ c++11 shared-ptr

我必须使用智能指针为类创建小型二叉树。当ChildL和ChildR是公共成员并且我直接使用它们时,一切都很好,但我应该创建具有私有成员的树并通过函数访问。 控制台中的结果只是:root 你能帮助我吗 ?我正在使用visual studio 2015。

#include <iostream>
#include <memory>
#include <string>
using namespace std;

class Node
{
public:
    Node(string n) : name(n) {}
    shared_ptr<Node> getChildL()
    {
        return ChildL;
    }
    shared_ptr<Node> getChildR()
    {
        return ChildR;
    }
    shared_ptr<Node> createChildL(string n)
    {
        return shared_ptr<Node>(new Node(n));
    }
    shared_ptr<Node> createChildR(string n)
    {
        return make_shared<Node>(n);
    }
    string getName() 
    { 
        return name;
    }
private:
    string name;
    shared_ptr<Node> ChildL, ChildR;
};

void PrintTree(shared_ptr<Node> tree)
{
    if (tree) 
    {
        cout << tree->getName() << endl;
        PrintTree(tree->getChildL());
        PrintTree(tree->getChildR());
    }
}

int main()
{
    shared_ptr<Node> root = make_shared<Node>("root");
    root->getChildL() = root->createChildL("leaf");
    PrintTree(root);
    cin.get();
}

1 个答案:

答案 0 :(得分:1)

该成员:

shared_ptr<Node> createChildL(string n) {
    return shared_ptr<Node>(new Node(n));
}

不分配给ChildL。它只是创建一个新节点,将其嵌入共享指针,然后返回它。

你可能(我想)实施:

std::shared_ptr<Node> createChildL(std::string n) {
    ChildL=std::make_shared<Node>(n);
    return ChildL;
}

然而,这不是最佳方式。如果您尝试做的只是封装,请考虑实现get / set对:

void setChildL(const std::shared_ptr<Node>& left) {
    ChildL=left;
}

您可能希望构建一个BinaryTree类来处理以遵循树不变量的方式插入/删除节点(例如,ChildL-&gt; n&lt; = n和ChildR-&gt; n&gt; n对于每个节点。)。