[英]Copy constructor question Lippman
我试图解决一个副本ctro qs给出的唇膏n不确定如果我做对了。 由于课程有自己的指针,它让我有点困惑。 这是代码
#include <iostream>
#include <string>
using namespace std;
class BinStrTreeNode{
public:
BinStrTreeNode(const string& val):_val(val){
_leftchild = new BinStrTreeNode("nup");
_rightchild = new BinStrTreeNode("rup");
cout << "ctor" << endl;
};
BinStrTreeNode(const BinStrTreeNode&);
private:
string _val;
BinStrTreeNode *_leftchild;
BinStrTreeNode *_rightchild;
};
BinStrTreeNode::BinStrTreeNode(const BinStrTreeNode& rhs):_val(rhs._val){
cout << "copy ctor" << endl;
_leftchild = new BinStrTreeNode(*(rhs._leftchild));
_rightchild = new BinStrTreeNode(*(rhs._rightchild));
}
它给出了分裂的错误。 我知道我也需要定义一个dtor,但首先我需要做到这一点。 我应该如何定义这样的类的复制ctor,赋值运算符?
谢谢
你得到它基本上是正确的。
你只是忘了检查NULL指针。
BinStrTreeNode::BinStrTreeNode(const BinStrTreeNode& rhs)
:_val(rhs._val)
,_leftchild(NULL)
,_rightchild(NULL)
{
cout << "copy ctor" << endl;
if (rhs._leftchild != NULL) {_leftchild = new BinStrTreeNode(*(rhs._leftchild));}
if (rhs._rightchild != NULL) {_rightchild = new BinStrTreeNode(*(rhs._rightchild));}
}
注意树不会指向树中更高(或自我)的节点(因为它不再是树,它将是图形)。 如果您的代码是图形,那么您需要重新编写此代码,以便执行图形复制,因为您需要跟踪已在地图中复制的节点,因此复制要复杂得多。
虽然我个人会更进一步,并在初始化列表中执行所有操作:
虽然我只是说这是个人偏好。
BinStrTreeNode::BinStrTreeNode(const BinStrTreeNode& rhs)
:_val(rhs._val)
,_leftchild ((rhs._leftchild == NULL)?NULL:new BinStrTreeNode(*(rhs._leftchild)))
,_rightchild((rhs._rightchild == NULL)?NULL:new BinStrTreeNode(*(rhs._rightchild)))
{
cout << "copy ctor" << endl;
}
让我们从头开始:
在这种情况下,我们需要跟踪我们创建的每个节点。 然后,当一个指针指向已经被复制的节点时,我们使用复制的节点而不是创建一个新的节点(否则我们最终会在循环回转之后进行一次递归的噩梦)。
typedef std::map<BinStrTreeNode*,BinStrTreeNode*> CopyMap;
BinStrTreeNode::BinStrTreeNode(const BinStrTreeNode& rhs)
:_val(rhs._val)
{
CopyMap copyMap;
copyMap[&rhs] = this;
left = copyGraph(left,copyMap);
right = copyGraph(right,copyMap)
}
private:
BinStrTreeNode* BinStrTreeNode::copyGraph(BinStrTreeNode* node,CopyMap& copyMap)
{
if (node == NULL)
{ return NULL;
}
if (copyMap[node] != NULL)
{ return copyMap[ndoe];
}
return new BinStrTreeNode(*node, copyMap);
}
BinStrTreeNode::BinStrTreeNode(const BinStrTreeNode& rhs, CopyMap& copyMap)
:_val(rhs._val)
{
copyMap[&rhs] = this;
left = copyGraph(left,copyMap);
right = copyGraph(right,copyMap)
}
您的复制构造函数是递归的。 您可能已经耗尽了内存或者有新的内存异常,或者很可能在其中一个复制构造函数调用中取消引用了空指针。
你的主要问题是两个构造函数都无限递归:
new
抛出std::bad_alloc
。 您的潜在问题是您的递归函数没有终止条件。 所有函数(包括构造函数)都需要一个不递归的代码路径。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.