2014-01-19 5 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(); 
} 

내가 어떤 배우자가없는 때마다 아이들을 삭제 소멸자 생성 :

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

그렇게하지를 내 사본 생성자 및 운영자가 배우자 및 자녀의 다른 인스턴스를 생성해야하는지 확인하십시오. 나는 이것을하려고했지만 무한한 참조에 쌓여 있었다. 배우자와 자녀가 적절히 배정 된 Person 객체의 복사본을 만들 수 있습니까? 의견과 제안에 미리

덕분에 Elkhunter

+3

완전히 알고 싶습니다. * 자녀 *는 이미 * 자녀 *입니다. * 아이들 *은 문법적 오류 일뿐입니다. 또한이 세상에 5 명 이상의 아이들이있는 사람들이 있기 때문에 대신'std :: vector'에 넣는 것이 좋습니다. 또한 삭제 문제를 해결합니다. –

+0

왜''std :: string'이 아닌'name'을위한 포인터를 사용합니까 (http://en.cppreference.com/w/cpp/string/basic_string)? 또한 생성자에서 'childrens'및 '배우자'멤버를 제대로 초기화하고 있습니까? 사람이 다섯 명이 넘으면 어떻게 될까요? 아마도 예를 들어. ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector) 대신에? –

+0

@NielsKeurentjes : 저는 심볼 이름에서 문법에 대해 너무 걱정하지 않는 경향이 있습니다. 'Person' 클래스를 생각해보십시오. 두 번 인스턴스화하면 두 개의 Person이 생깁니다. 이것은 사실상 영어의 경우에 유효합니다. 그러나 여러분은 제가 의미하는 바를 봅니다. 더 좋은 예가 필요한 경우, 도대체 "소멸자"는 무엇입니까? 즉, 그는 "아이들"이라는 뜻입니다. :) –

답변

0

문제는 당신이 얽힌 관계를 재귀 적으로 처리하려고한다는 것입니다. 남편이 아내를두고 둘 다 다른 사람을 삭제하면 재귀 지옥에 갇히게 될 것입니다.

대신 참조를 포인터로 유지하고 은 소멸자에서을 삭제하지 마십시오. 이는 단순히 클래스의 책임이 아닙니다. 실제 남편이 죽었을 때 그의 아내도 자동으로 죽는다고 상상해보십시오.

는 그냥 '마스터 카탈로그'당신 '세계에있는 사람들의 같은 별도의 std::vector Person의 인스턴스를 유지하고, 그들의 관계를 통해 유유히 서로를 참조 할 수 있습니다. 모든 삭제 비극을 극단적 인 비 재귀 적 장소에 넣고 모든 문제를 해결합니다.

+0

소멸자에서 남편을 삭제하지 않습니다. 아내가 죽으면 남편 반에 아내에게의 포인터를 지우고 아이들과는 아무 것도하지 않습니다. 아내가 남편이 없다면 다른 누구도 그들에 대해 알지 못하기 때문에 나는 자녀를 지울 것입니다 (더 이상 어린이 물건에 대한 포인터가 없습니다). 아직도 복사 생성자와 연산자 =를 만드는 방법을 모른다. – elkHunter

+0

흠 ... '마스터 카탈로그'는 나에게 많은 일을 덜어 준다. 이 인스턴스를 사용하면 소멸자를 단순화하고 복사 생성자의 올바른 모양에 대해 더 이상 걱정할 필요가 없습니다. 그러나 '마스터 카탈로그'가 없으면 올바른 생성자를 구현하는 다른 방법이 없다는 것을 의미합니까? – elkHunter

+0

mem 누수를 피하기위한 대안은 참조 횟수입니다. –

2

나는 당신이 그것을 길을 잘못 설계라고 생각합니다. 클래스 Person에는 오직 하나의 잘 정의 된 책임이 있어야합니다. 지금은 적어도 두 가지 별도 개념, 즉 사람패밀리을 대표합니다. 이 두 개념을 별도의 유형으로 분리하여 구현하는 것이 더 쉬워야합니다.

+0

불행히도이 클래스의 속성을 변경할 수 없습니다. 교수님이 생성자, 소멸자 등에 대한 지식을 확인하고 싶습니다. – elkHunter

관련 문제