具有指向同一对象的对象的类

时间:2014-01-19 17:13:17

标签: c++ destructor copy-constructor self-reference

我正在尝试使用指向配偶(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

2 个答案:

答案 0 :(得分:2)

我认为你的设计方式不对。类Person最好只有一个明确的责任。现在,它代表至少两个独立的概念 - person family 。考虑将这两个概念分成不同的类型 - 它应该更容易实现它。

答案 1 :(得分:0)

你的问题是你试图以递归方式处理交织在一起的关系。当一个丈夫有一个妻子,并且都删除了另一个,你当然会陷入递归的地狱。

相反,将引用保留为指针,删除析构函数中的任何一个 - 它根本不是类的责任。想象一下,当一个真正的丈夫去世时,他的妻子也会自动死亡吗?

只需将std::vectorPerson个实例作为“世界”中人们的'主目录',并让他们通过他们的关系懒洋洋地互相参考。将所有删除的痛苦放在一个非常非递归的地方,并解决所有问题。