假设我有一个员工树,每个员工都有同事,同事有同事.....我设置了两个员工用来存储员工的信息 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 ,然后查看结果; 谢谢!
答案 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