我正在尝试使用指向配偶(Person对象)和子表(Person对象)的指针创建类Person。这个类实现了婚姻(操作符+ =),离婚(方法)和创建新子(操作符++):
class Person{
private:
char* name;
int sex;
Person* spouse;
Person* children[5];
public:
Person();
Person(const Person&);
Person & operator =(const Person&);
Person & operator +=(Person&);//marriage
Person & operator ++();//new children
void divorce();//divorce
Person::~Person();
}
我创建了析构函数,可以在没有配偶的情况下删除子项:
Person::~Person(){
if (name !=NULL)
delete [] name;
name=NULL;
if (spouse!=NULL)
spouse->spouse =NULL;
else{
for (int i=0; i<5;i++){
if (children[i]!=NULL)
delete children[i];
children[i]=NULL;
}
}
}
我不知道我的拷贝构造函数和operator =是否应该创建配偶和子代的另一个实例。我试图这样做,但我是无限参考堆栈。是否可以使用正确分配的配偶和子女创建Person对象的副本?
提前感谢您的任何意见和建议 Elkhunter
答案 0 :(得分:2)
我认为你的设计方式不对。类Person
最好只有一个明确的责任。现在,它代表至少两个独立的概念 - person 和 family 。考虑将这两个概念分成不同的类型 - 它应该更容易实现它。
答案 1 :(得分:0)
你的问题是你试图以递归方式处理交织在一起的关系。当一个丈夫有一个妻子,并且都删除了另一个,你当然会陷入递归的地狱。
相反,将引用保留为指针,不删除析构函数中的任何一个 - 它根本不是类的责任。想象一下,当一个真正的丈夫去世时,他的妻子也会自动死亡吗?
只需将std::vector
个Person
个实例作为“世界”中人们的'主目录',并让他们通过他们的关系懒洋洋地互相参考。将所有删除的痛苦放在一个非常非递归的地方,并解决所有问题。