2014-01-19 38 views
0

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

我created析其删除children每当有没有配偶:

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; 
      } 
    } 
} 

我do不知道我的拷贝构造函数和操作符=是否应该创建另一个配偶和子女的实例。我试图做到这一点,但我是在无限的参考堆栈。是否可以使用正确分配的配偶和子女创建Person对象的副本?

感谢您的任何意见和建议 Elkhunter

+3

完全偏离主题 - 但你知道*孩子*已经是孩子*的复数,所以*孩子*只是一个语法错误?此外,这个世界上有超过5个孩子的人,所以我建议将它放在'std :: vector'中。还解决了他们的删除问题。 –

+0

为什么使用'name'而不是['std :: string'](http://en.cppreference.com/w/cpp/string/basic_string)的指针?另外,你正在初始化构造函数中的'childrens'和'spouse'成员?如果一个人有五个以上的孩子呢?可能使用例如而不是['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)? –

+0

@NielsKeurentjes:我倾向于不太担心符号名称中的语法问题。考虑一个类'Person':如果你实例化两次,你有两个'Persons'。这在边缘情况下实际上是英文的,但你明白我的意思。如果你需要一个更好的例子,那么“析构函数”是什么?这就是说,他_did_在这里的意思是“孩子们”:) –

回答

0

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

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

只要保持一个独立的Personstd::vector实例为“主目录”的人在“世界”,并让他们懒洋洋地引用海誓山盟通过它们之间的关系。把所有的删除痛苦放在一个非递归的地方,并解决所有问题。

+0

我不会在我的析构函数中删除丈夫。当妻子去世后,我在丈夫课上删除了指向妻子的指针,而对儿童则什么都不做。如果妻子没有丈夫,我会删除她的孩子,因为没有人知道他们(没有更多的指向儿童对象的指针)。我仍然不知道如何创建copy-constructor和operator =。 – elkHunter

+0

嗯......'主目录'可以为我节省很多工作。有了这个实例,我可以简化析构函数,不再担心复制构造函数的正确外观。但是,这是否意味着没有其他方法来实现没有'主目录'的正确构造函数? – elkHunter

+0

避免内存泄漏的替代方法是引用计数。 –

2

我认为你的设计就走错了路。 Person类最好只有一个定义明确的责任。现在,它代表至少两个单独的概念 - 家族。考虑将这两个概念分成不同的类型 - 它应该使它更容易实现。

+0

不幸的是,我无法更改此类的任何属性。我认为我的教授想要检查我们关于构造函数,析构函数等的知识。 – elkHunter