c ++: создать производный объект из другого производного типа - PullRequest
0 голосов
/ 21 апреля 2020

предполагается, что у меня есть эти классы, и следующие основные:

class LabTest
{
private:
    std::string labID;
    bool result;
};
class Person
{
protected:
    std::string name;
    std::string lastName;
    std::string ID;
    std::list<LabTest> testList;
};
class Sick :public Person
{
    //
};
//Encounter represents a person who comes in contact with a verified Sick
class Encounter : public Person
{
    //
};
void main()
{
    std::list<Person*> personList;
    std::list<LabTest*> testList;
}

Теперь, если Encounter получил положительный результат LabTest, мне нужно заменить Encounter из personList в Sick. Я хотел бы написать что-то вроде этого:

void updateStatusPerson(Person* person, bool resultLabTest)
{
    if (resultLabTest)
    {
        person = new Sick(/*(Encounter*)person*/);
    }
}

, что Person * от типа Sick, заменить Person * от типа Encounter .. поэтому для реализации этого я добавил это в классе Sick:

Sick::Sick(Encounter* encounter) :Person(*(Person*)encounter)
{
    delete encounter;
}

Хотя я реализовал конструктор глубокого копирования в классе Person (для выделения памяти). на самом деле я получил значение нежелательной в Person * в personList. Есть ли способ сделать это? Есть ли лучший дизайн для этого случая? спасибо вам всем.

1 Ответ

0 голосов
/ 21 апреля 2020

В updateStatusPerson вы берете копию указателя на Person в качестве первого аргумента. При удалении этого указателя delete на что бы он ни указывал, его присвоение, однако, не изменит значения памяти, на которую он указывал, а просто изменит адрес, на который он указывает. Это означает, что переданный вами указатель станет недействительным, и у вас возникнет утечка памяти. Вы можете исправить это, взяв ссылку на указатель на Person в качестве первого параметра:

void updateStatusPerson(Person*& person, bool resultLabTest)
{
    if (resultLabTest)
    {
        person = new Sick(/*(Encounter*)person*/);
    }
}
...