Я хотел спросить, как мы будем реализовывать конструктор копирования класса, который имеет собственный указатель на себя в качестве члена данных, я хочу реализовать глубокую копию,
class City
{
string name;
City* parent;
public:
City(string nam, double dcov);
City(string nam, double dcov, City* c);
City(const City& obj)
{
this-> name = obj.name;
// how to assign parent
parent = new City(??)
}
~City();
void setName(string name1);
void setDistanceCovered(int dist);
string getName();
double getDistanceCovered();
City* getParent(){return parent;}};
Я запутался что эта строчка // how to assign parent
будет вызывать конструктор снова вместо глубокого копирования?
parent = new City(??)
С уважением.
Как насчет
if (obj.parent != NULL)
parent = new City(*obj.parent)
else
parent = NULL;
Это должно работать, если у вас нет циклов в родительской иерархии.
Ответ Кристиана совершенно хорош.
В случае, когда вы не завершаете цепочку указателем NULL, а ссылаетесь на себя (это вы пытаетесь сказать «указателем на себя»?), Вы можете сделать это:
if(obj.parent == NULL)
parent = NULL;
else if(obj.parent==&obj)
parent=this;
else parent = new City(*obj.parent);
Если у вас есть циклы, которых вы хотите избежать, вам нужно использовать временную карту регистрации:
class City
{
string name;
City* parent;
/// The DB to avoid for infinite loops in case of circular references
static
std::map<const City*,City*>& parents_db()
{ static std::map<const City*,City*> ret;
return ret;
}
/// The cloning function that make use of the DB
static
City* clone_parent(const City *_parent)
{ if(_parent)
{ City *& cloned_parent = parents_db()[_parent];
if(!cloned_parent)
cloned_parent = new City(_parent);
return cloned_parent;
}
return NULL;
}
/// The private constructor that make use of the cloning function
City(const City* obj) :
name(obj->name),
parent(clone_parent(obj->parent))
{}
public:
City(string nam, double dcov);
City(string nam, double dcov, City* c);
/// The public constructor that cleans up the DB after cloning the hierarchy
City(const City& obj) :
name(obj.name),
parent(clone_parent(obj.parent))
{ parents_db().clear();
}
~City();
void setName(string name1);
void setDistanceCovered(int dist);
string getName();
double getDistanceCovered();
City* getParent(){return parent;}};