Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 43

C++ деструктор

23.04.2020, 18:07. Показов 618. Ответов 13

Студворк — интернет-сервис помощи студентам
Прошу помочь с реализацией деструктора- после удаления обьекта муж пола обьекты жп не выводятся




(ФАЙЛ person.h)
#ifndef PERSON_H_INCLUDED
#define PERSON_H_INCLUDED
#include <iostream>
#include "Data.h"
enum gender
{
MALE,
FEMALE
};
class Person
{
private:
Data d;
gender c;
std::string name;
Person* spouse;
public:
Person( gender c, std::string name, Data d, Person* spouse=nullptr) :d(d),c(c), name(name), spouse(spouse)
{}
~Person()
{
(this->spouse)->spouse=nullptr;
// spouse->spouse = nullptr;
}
friend std::ostream& operator<<(std::ostream& out, const Person& f )
{
if ( f.spouse == nullptr && f.c == gender::MALE)
out << "Male" << " " << f.name << " " << f.d << " " << " is single " << " \n";
if (f.spouse == nullptr && f.c == gender::FEMALE)
out << "Female" << " " << f.name << " " << f.d << " " << " is single " << " \n";
if (f.spouse != nullptr && f.c == gender::FEMALE)
out << "Female" << " " << f.name << " " << f.d << " is married on "<< f.spouse->name << " " << f.spouse->d << " \n";
if (f.spouse != nullptr && f.c == gender::MALE)
out << "Male" << " " << f.name << " " << f.d << " is married on "<< f.spouse->name << " " << f.spouse->d << " \n";
return out;
}

void Marry(Person& other)
{
if (this->c != other.c && other.spouse == nullptr && this->spouse == nullptr)
{
this->spouse = &other;
other.spouse = this;
}
else
cout << this->name << " and " << other.name << " cant be married \n";
}
void Divorce()
{
if ( this->spouse != nullptr)
{
this->spouse->spouse = nullptr;
this->spouse = nullptr;
}
else
cout << this->name << " cant be divorced \n";
}
void ChangeName(std::string name1)
{
this->name = name1;
}
};
#endif
ФАЙl MAIN>CPP
#include "Person.h"
#include <iostream>
int main()
{
Person* pm [3] ; // male
Person* pf[3]; // female
pm[0] = new Person(MALE, "Alex", Data(1, 2, 2011));
pf[0] = new Person(FEMALE, "Anna", Data(21, 12, 2001));
pm[1] = new Person(MALE, "Felix", Data(6, 18, 2001));
pf[1] = new Person(FEMALE, "Diana", Data(7, 12, 2001));
pm[2] = new Person(MALE, "Zeus", Data(8, 22, 2001));
pf[2] = new Person(FEMALE, "Afina", Data(1, 2, 2001));
pm[0]->Marry(*pf[0]);
pf[1]->Marry(*pm[1]);
pm[2]->Marry(*pf[2]);
cout << *pm[0];
cout << *pf[0];
cout << *pm[1];
cout << *pf[1];
cout << *pm[2];
cout << *pf[2];
pm[0]->Divorce();
cout << (*pm[0]);
cout << (*pf[0]);
pm[0]->ChangeName("OLEG");
cout << (*pm[0]);
//pm[0]->~Person();
//pm[1]->~Person();
// pm[2]->~Person();
delete pm[0];
delete pm[1];
delete pm[2];
cout << *pf[1];
delete pf[0];
delete pf[1];
delete pf[2];


//pf[0]->~Person();
// pf[1]->~Person();
// pf[2]->~Person();
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.04.2020, 18:07
Ответы с готовыми решениями:

Почему создается виртуальный деструктор A, а в таблице виртуальных функций лежит деструктор B
Почему я делаю виртуальным деструктор A, а в таблице виртуальных функций лежит деструктор B?

Деструктор
Вроде все просто но чето никак не работает Задача: Написать программу в которой Конструктор класса MyCl выводит сообщение на...

Деструктор!
Как вызвать деструктор? #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;string&gt; ...

13
 Аватар для _-_VLADoS_-_
130 / 87 / 48
Регистрация: 27.12.2019
Сообщений: 510
23.04.2020, 18:10
Это зачем?
C++
1
2
3
//pf[0]->~Person();
// pf[1]->~Person();
// pf[2]->~Person();
Рекурсивный класс
C++
1
Person* spouse;
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 43
23.04.2020, 18:13  [ТС]
это попытки решить проблему
0
 Аватар для _-_VLADoS_-_
130 / 87 / 48
Регистрация: 27.12.2019
Сообщений: 510
23.04.2020, 18:22
ALLAh_2, сделайте без этого

Добавлено через 7 минут
ALLAh_2,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
enum gender
   {
    MALE,
    FEMALE
   };
 
class Person
{
    public:
    Person(void);
    Person(gender& other,string name);
    ~Person(void);
    
    private:
    
   gender c;
   string name;
    
};
 
Person::Person()=default;
Person::Person(gender& c,string name):c(c),name(name){}
Person::~Person()=default;
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 43
23.04.2020, 18:53  [ТС]
А возможно ли рекурсивно удалять память? Хочу оставить поле spouse
0
 Аватар для _-_VLADoS_-_
130 / 87 / 48
Регистрация: 27.12.2019
Сообщений: 510
23.04.2020, 18:59
ALLAh_2, так конечно лучше не делать. Там рекурсии нет , но класс имеет поле своего типа
C++
1
2
3
4
5
6
7
8
Person::~Person()
{
  if(this->spouse!=nullptr)
    {
       delete spouse;
        spouse= nullptr;
    }
}
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 43
23.04.2020, 19:04  [ТС]
возникает исключение stack overflow,не могу найти проблему
0
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,993
23.04.2020, 19:16
_-_VLADoS_-_, вот так компактнее, в деструкторе можно не обнулять, экземпляр заканчивает существование

C++
1
2
3
4
Person::~Person()
{
    delete spouse;
}
ALLAh_2, отладчик запусти - переполнение стека ловится на раз
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 43
23.04.2020, 20:01  [ТС]
связано ли это с тем,что поле споуз удаляется у удаленного обьекта?
также мне нужно удалять поле споуз у обьекта,который ссылается на удаленный
0
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,993
23.04.2020, 20:21
ALLAh_2, почитай про std::shared_ptr. Тогда такие манипуляции со ссылками на другие объекты будет гораздо проще делать

Да и в деструкторе само подчистится

C++
1
2
3
4
5
6
7
8
class Person
{
   private:
   Data d;
   gender c;
   std::string name;
   std::shared_ptr<Person> spouse;
};
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 43
24.04.2020, 19:52  [ТС]
Person::~Person()
{
delete spouse;
}
никак не могу понять где идет переполнение стека и как его исправить(вложения)
Миниатюры
C++ деструктор  
0
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,993
24.04.2020, 20:09
ALLAh_2, покажи полный код. Используй тег [CPP][/CPP]
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 43
24.04.2020, 20:12  [ТС]
https://onlinegdb.com/rkV105eFL
ссылка на полный код в онлайн сервисе
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12925 / 6793 / 1819
Регистрация: 18.10.2014
Сообщений: 17,189
24.04.2020, 20:44
Цитата Сообщение от ALLAh_2 Посмотреть сообщение
никак не могу понять где идет переполнение стека и как его исправить(вложения)
С этим как раз таки все ясно.

Здесь создается кольцевой список

Цитата Сообщение от ALLAh_2 Посмотреть сообщение
C++
1
2
3
4
5
void Marry(Person& other)
{
  ...
  this->spouse = &other;
  other.spouse = this;
А здесь

C++
1
2
3
4
Person::~Person()
{
  delete spouse;
}
идет бесконечная рекурсия по этому кольцевому списку.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.04.2020, 20:44
Помогаю со студенческими работами здесь

Деструктор
Изучаю с++ по книге Роберта Лафора не могу догнать до конца про деструкторы. вот допустим пример #include&lt;iostream&gt; using...

Деструктор
Здравствуйте! Имеется класс Matrix, который представляет собой массив других объектов - объектов класса Vector class Vector ...

Деструктор
В каком случае необходимо явно определять деструктор?

Деструктор
Здравствуйте, все работает отлично, но когда я добавила деструктор, то сразу выдало ошибку, помогите разобраться)). Спасибо! //Создать...

Деструктор
Я написал деструктор, но препод сказал переделать так как надо было смотреть на то, как я выделял память. Помогите исправить. int **m6; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru