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

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

23.04.2020, 18:07. Показов 640. Ответов 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
6461 / 5666 / 1130
Регистрация: 11.10.2019
Сообщений: 15,080
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
6461 / 5666 / 1130
Регистрация: 11.10.2019
Сообщений: 15,080
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
6461 / 5666 / 1130
Регистрация: 11.10.2019
Сообщений: 15,080
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
12941 / 6808 / 1821
Регистрация: 18.10.2014
Сообщений: 17,231
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
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. На мобильном - сканируйте QR-код. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru