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

Returning shared pointer, binary tree C++11,

我必须使用智能指针为 class 创建小型二叉树。当 ChildL 和 ChildR 是 public 成员并且我直接使用它们时,一切都很好,但我应该创建具有私有成员的树并通过函数访问。 控制台中的结果只是: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();
}

这位会员:

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

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

您可能(我想)实施:

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 class 以遵循树不变性的方式处理节点的插入/删除(例如 ChildL->n <= n 和 ChildR->n >n 代表每个节点。).