Класс с указателем на объект того же класса

Я пытаюсь создать класс 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

0

Решение

Ваша проблема в том, что вы пытаетесь рекурсивно обрабатывать взаимосвязанные отношения. Когда у Мужа есть Жена, и оба удаляют другую, вы, конечно же, застрянете в рекурсивном аду.

Вместо этого сохраните ссылки как указатели, и не делайте удалить любого из них в деструкторе — это просто не ответственность класса. Представьте себе, когда умирает реальный муж, его жена тоже умирает автоматически?

Просто держите отдельно std::vector из Person случаи как «Мастер каталог» людей в вашем «мире», и пусть они лениво ссылаются друг на друга через свои отношения. Помещает все проблемы удаления в одно чрезвычайно нерекурсивное место и решает все проблемы.

0

Другие решения

Я думаю, что вы проектируете это неправильно. Учебный класс Person желательно иметь только одну четко определенную ответственность. Прямо сейчас это представляет по крайней мере два отдельных понятия — человек и семья. Рассмотрите возможность разделения этих двух понятий на отдельные типы — это должно упростить его реализацию.

2

По вопросам рекламы [email protected]