繁体   English   中英

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

[英]Class with pointer to object of the same class

我正在尝试使用指向配偶(Person对象)和子表(Person对象)的指针创建类Person。 这个类实现了婚姻(operator + =),离婚(方法)和创建新的子(operator ++):

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的任何意见和建议

我认为你的设计错误。 班级Person最好只有一个明确的责任。 现在,它代表了至少两个独立的概念 - 一个人和一个家庭 考虑将这两个概念分成不同的类型 - 它应该更容易实现它。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM