在二进位搜索树的类中,我有一个键和一个指向结构中左右节点的指针。
我在类的copy函数中得到parasoft错误,因此建议将代码更改为:
BinaryTree::Node* BinaryTree::copyHelper(const Node* other)
{
if(other == NULL)
{
return NULL; // If there's no Node to copy, return NULL.
}
else
{
//Node* newNode = new Node;
typedef std::unique_ptr<Node> NodePtr;
NodePtr newNode(new Node);
if(newNode)
{
newNode->name = other->name;
newNode->left = copyHelper(other->left);
newNode->right = copyHelper(other->right);
}
return newNode;
}
}现在,我收到了newNode返回语句中的一个错误:
IntelliSense:从
NodePtr到BinaryTree::Node *没有合适的转换函数
有什么想法吗?
发布于 2012-05-02 14:40:33
这是你的职责:
BinaryTree::Node* BinaryTree::copyHelper(const Node* other) { ...}它返回一个BinaryTree::Node*,并且应该返回一个unique_ptr<Node>
std::unique_ptr<BinaryTree::Node> BinaryTree::copyHelper(const Node* other) { ...}发布于 2012-05-02 14:32:56
啊哈。不能将unique_ptr<T>转换为T*。它们不是相同的类型,它们没有相同的语义,特别是当它们被复制时。这就是为什么unique_ptr<T>没有将运算符转换为T*的原因。T*不是一个类,所以您不能像返回声明的返回类型的子类那样依靠多态性来完成工作(事实上,unique_ptr的语义差异意味着子类无论如何都是错误的关系)。
因此,您在这里没有选择-您必须返回一个unique_ptr<T>,让您的调用者处理后果,因为他们需要知道这是一个unique_ptr<T>,行为像一个。如果你觉得这是一个负担太大,我建议阅读智能指针,以更好地理解他们是什么,他们为你做了什么。
您可能还需要考虑它是否是正确的智能指针类,因为shared_ptr<T>可能有更适合您的语义。
发布于 2012-05-02 14:50:16
如果我理解它,copyHelper是一个内部函数,而不是接口的一部分。如果是这样,那么最简单的解决方案是更改签名以返回unique_ptr,而不是原始指针。
另一种方法是在unique_ptr in copyHelper上调用copyHelper,以放弃所有权,并让调用方在自己的unique_ptr中收回它(为此您需要使用reset),但是在下一步要将其存储在unique_ptr中时,没有必要遍历原始指针。
https://stackoverflow.com/questions/10415636
复制相似问题