2014-01-19 72 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