Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
传递“这个”作为UnQuyJPPTC++_C++_Recursion_Unique Ptr - Fatal编程技术网

传递“这个”作为UnQuyJPPTC++

传递“这个”作为UnQuyJPPTC++,c++,recursion,unique-ptr,C++,Recursion,Unique Ptr,我有一个在二叉树中充当节点的类,我想从该类内部调用的方法之一是递归的,需要将自身传递到树中的下一个节点,以便下一个节点知道自己的父节点。我不想存储类成员父级,因为我想避免使用共享\u ptr 代码如下所示: void MyClass::expand(MyClass* parent){ for (int i = 0; i < children.size; i ++){ children[i]->doSomethingWithParent(parent);

我有一个在二叉树中充当节点的类,我想从该类内部调用的方法之一是递归的,需要将自身传递到树中的下一个节点,以便下一个节点知道自己的父节点。我不想存储类成员父级,因为我想避免使用共享\u ptr

代码如下所示:

void MyClass::expand(MyClass* parent){
    for (int i = 0; i < children.size; i ++){
        children[i]->doSomethingWithParent(parent);
        children[i]->expand(this);
    }
    return;
}

但我希望传递一个唯一的\u ptr,而不是原始指针。但是,指向“this”的指针已经被一个惟一的ptr包装在别处,所以我不想实例化另一个。有可能这样做吗

如果有任何设计模式,我应该知道,请让我知道


任何帮助都值得欣赏

如果您曾经遇到过这样的情况,即您希望传递一个保证为非空的非拥有指针(这里就是这种情况),那么您可能只想使用一个引用

在您的情况下,根据doSomethingWithParent执行的操作,您可能实际上还需要一个常量引用:

void MyClass::doSomethingWithParent(const MyClass& parent) {
  // who knows?
}

void MyClass::expand(const MyClass& parent) {
    for (int i = 0; i < children.size; i ++){
        children[i]->doSomethingWithParent(parent);
        children[i]->expand(*this);
    }
}

根本不要使用指针。您没有取得所有权,参数不是可选的,因此请使用引用:

void MyClass::expand(MyClass& parent){
    for (int i = 0; i < children.size; i ++){
        children[i]->doSomethingWithParent(parent);
        children[i]->expand(*this);
    }
    return;
}

您的所有代码都将执行相同的操作,而且更安全等等。

这不是一个好的设计。使用共享的\u ptr并从\u this启用\u共享的\u作为MyClass的基类。我想传递唯一的\u ptr而不是原始指针为什么?这不像expand获得传递指针的所有权。原始指针不是邪恶的。需要避免的是表示所有权的原始指针。子类是MyClass的成员吗?如果是这样,孩子们永远不能拥有或分享这个。使用unique_ptr是在要求灾难发生。您已将对象的所有权移交给该包装器。仅使用智能指针管理对象的生存期/删除。除非万不得已,否则不要把它们传给别人。传递原始指针。参数不是可选的。根目录没有父目录,所以指针是合法的。