如何使用智能指针构建树?

时间:2015-11-17 04:51:11

标签: c++ pointers tree

假设我有一个员工树,每个员工都有同事,同事有同事.....我设置了两个员工用来存储员工的信息 eTree 代表架构。

每位员工都有向量商店智能指针指向他们的同事。看下面的代码。为什么智能指针指向的地址最终变为 00000000 。我已将指针退出函数 buildChilds

private void hideSoftKeyboard(){
    if(getCurrentFocus()!=null && getCurrentFocus() instanceof EditText){
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
    }
}

您可以输入 a-> 2-> b-> 0-> c-> 0 ,然后查看结果; 谢谢!

1 个答案:

答案 0 :(得分:1)

问题是您正在创建根员工的许多副本并在不同位置使用副本。

在您的主要功能中,请尝试以下操作:

shared_ptr<employee> proot = make_shared<employee> (name, num);
eTree tree(proot);
tree.buildTree(proot);

然后更新您的eTree构造函数:

eTree(std::shared_ptr<employee> node) { proot = node; }

我的推理:

在您的代码中,您似乎创建了一名新员工:

employee root(name, num);

然后你做了一个复制但是一个智能指针:

shared_ptr<employee> proot = make_shared<employee> (root);

然后你把原件交给eTree:

eTree tree(root);

和buildTree函数的副本:

tree.buildTree(proot);

因此,构建树为另一个员工副本构建树

编辑:此外,您的eTree构造函数还将另一个副本作为智能指针,因此最终您将得到原始员工的3个实例。

删除员工的复制构造函数,如下所示:您将看到会发生什么:

employee(const employee&) = delete;

我的代码会编译,你的代码不会......

编辑:显示std::make_shared<>()构建新对象的示例代码:

#include <memory>
#include <iostream>

class MyClass {
public:
    MyClass() { std::cout << "    -> MyClass Constructor called\n"; }
    MyClass(const MyClass& other) { std::cout << "    -> MyClass Copy Constructor called\n"; }
};

int main(int argc, char *argv[])
{
    std::cout << "[1] Making MyClass\n";
    MyClass myClass;
    std::cout << "[2] Making MyClass Pointer\n";
    MyClass* myClassPtr = new MyClass();
    std::cout << "[3] Making MyClass Shared using New\n";
    std::shared_ptr<MyClass> myClassSmart1 = std::shared_ptr<MyClass>(new MyClass());
    std::cout << "[4] Making MyClass Shared\n";
    std::shared_ptr<MyClass> myClassSmart2 = std::make_shared<MyClass>();
    std::cout << "[5] Making MyClass Shared from first MyClass\n";
    std::shared_ptr<MyClass> myClassSmart3 = std::make_shared<MyClass>(myClass);
    std::cout << "Done\n";
}

上面的代码证明std::make_shared<T>()构造了一个新对象,而不是仅为已有对象创建共享指针。 此外,std::make_shared<Class>(class)使用复制构造函数来创建新对象。

我计算机上面的输出是:

[1] Making MyClass
    -> MyClass Constructor called
[2] Making MyClass Pointer
    -> MyClass Constructor called
[3] Making MyClass Shared using New
    -> MyClass Constructor called
[4] Making MyClass Shared
    -> MyClass Constructor called
[5] Making MyClass Shared from first MyClass
    -> MyClass Copy Constructor called
Done