alex_deerk
@alex_deerk
В ответах некомпетентен. Пытаю Python

Добавление в динамический массив объектов. Кто поможет?

Пытаюсь добавить объект в массив, вроде бы использовал, похожий, но в том случае не надо было добавлять уже существующий объект в массив. Программа завершает свою работу, на третьем добавлении, а то и вовсе на втором
Прошу вас указать проблему.

Вот, собственно, код:
void addPacient(Patient &p){
        if(p.getAge() < 18){
            throw AgeException();
        } else{
            addDays();
            ++count_places;
            if(places != nullptr){
                Patient *temp = places;
                places = new Patient[count_places];
                for(int i = 0; i < count_places - 1; i++){
                    places[i] = temp[i];
                }
                delete []temp;
                places[count_places - 1] = p;
                //cout << places[count_places - 1].getName() << endl;
            } else{
                places = &p;
                //cout << places->getName() << endl;
            }

        }
    }


И ещё вопрос: Таким образом, как я передаю объект в метод, я смогу изменять его? Это то же, что и передача через указатель?
  • Вопрос задан
  • 336 просмотров
Решения вопроса 2
Совет номер 1: используйте std::vector вместо массива. Это правда проще!
Совет номер 2: используйте именно вектор от Patient, то есть по возможности не используйте указатели для хранения объектов.

> Таким образом, как я передаю объект в метод, я смогу изменять его? Это то же, что и передача через указатель?
Да, ссылки -- это, по сути, удобные указатели.
> а что бы изменилось если бы я передавал через указатель?
Пришлось бы писать лишние разыменования.
Ответ написан
AtomKrieg
@AtomKrieg
Давай я поищу в Google за тебя
if(places != nullptr){
...
places[count_places - 1] = p; //здесь копируем
} else{
  places = &p; //а здесь мы разыменовываем, а нужно делать new[]
 //а на следующем вызове UB из-за delete[], потому что places не выделялось через new[]
}

Надо так
if(places != nullptr){
...
} else{
  count_places = 1;
  places = new Patient[1];
  places[0] = p;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Да, сможете: вы по ссылке передаете объект, а не по значению
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы