Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
1

Виртуальный деструктор на MinGW v4.9.2

13.07.2016, 19:07. Показов 1247. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
не знаю как на прошлых версиях, но на этой не работает чисто виртуальный деструктор. проверялось самым обычным тестом
C++
1
2
3
4
5
6
class A{
  virtual ~A()=0;
};
A::~A(){cout<<"~";}
 
class B : public A {};
пишет Cmultiple definition of `A::~A()'|
в vs все работает. может где-то подкрутить нужно?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.07.2016, 19:07
Ответы с готовыми решениями:

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

Виртуальный деструктор
Всем привет! Объясните пожалуйста новичку в ООП, вопрос чисто теоретический поэтому код не...

виртуальный деструктор
есть такой пример, у меня вопрос, почему здесь деструктор декларирован просто как деструктор, а не...

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

10
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
13.07.2016, 19:09 2
Хрисипп, а ключевое слово virtual написать?
0
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
13.07.2016, 19:10  [ТС] 3
Цитата Сообщение от DrOffset Посмотреть сообщение
а ключевое слово virtual написать
это я написал, забыл в вопрос вписать
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
13.07.2016, 19:17 4
Цитата Сообщение от Хрисипп Посмотреть сообщение
multiple definition of `A::~A()'|
Это ошибка линкера. Если определение деструктора находится в заголовочном файле, который подключается в несколько единиц трансляции, то ошибка справедливая. MinGW здесь абсолютно прав, что это не компилирует.
Либо вынеси определение в отдельную единицу трансляции, либо сделай его inline.
0
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
13.07.2016, 19:37  [ТС] 5
Цитата Сообщение от DrOffset Посмотреть сообщение
несколько единиц трансляции
да, работает если занести в мейн, но он подключается к другому хедеру, который в свою очередь к мейну
C++
1
2
3
4
5
6
7
8
9
10
// h1
#include "h2.h"
class A
 
//h2 
#include "h1.h"
class B:A
 
// cpp
#include "h2.h"
. и наоборот
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// h1
#include "two.h"
#ifndef h1
#define h1
 
class A{
public:
virtual ~A()=0;
 
 
};
A::~A(){}
#endif
 
//h2
#ifndef h2
#define h2
#include "one.h"
using namespace std;
class B : A {};
 
#endif
это же подключение к одной единице трансляции
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
13.07.2016, 19:45 6
Хрисипп, поясни как ты понимаешь назначение строки номер 2 в h1? Почему он у тебя не под include-guard'ом?

Добавлено через 5 минут
Цитата Сообщение от Хрисипп Посмотреть сообщение
это же подключение к одной единице трансляции
Да, но у тебя проблема похоже из-за невнесенного в include-guard подключения. В итоге содержимое "расплодилось". И если объявлений в программе может быть сколько угодно, то определение сущности должно быть одно (правило одного определения).

Как ни крути - программа остается некорректной, даже если VS ее каким-то чудом собирает. Следовательно в любом случае - оставлять определение не-inline функции в заголовочном файле не стоит.
0
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
13.07.2016, 19:48  [ТС] 7
DrOffset,
Цитата Сообщение от Хрисипп Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
// h1
#include "h2.h"
class A
//h2 
#include "h1.h"
class B:A
// cpp
#include "h2.h"
опять ошибся при написании ответа. там
C++
1
2
3
4
5
6
7
8
9
// h1
class A
 
//h2 
#include "h1.h"
class B:A
 
// cpp
#include "h2.h"
Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
расплодилось
тогда бы он сообщил, что deep include (это имеешь в виду?)
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
13.07.2016, 19:53 8
Лучший ответ Сообщение было отмечено DrOffset как решение

Решение

Хрисипп, ответ я тебе дал.
* В заголовочных файлах все содержимое должно быть в обрамлено include-guard`ом.
* В заголовочных файлах определений нешаблонных и не-inline функций быть не должно.
Собственно все.

Добавлено через 3 минуты
Цитата Сообщение от Хрисипп Посмотреть сообщение
тогда бы он сообщил, что deep include (это имеешь в виду?)
Не факт. Зависит от того есть ли циклическое включение. У тебя его нет, насколько ты смог показать.
1
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
13.07.2016, 20:09  [ТС] 9
Цитата Сообщение от DrOffset Посмотреть сообщение
циклическое включение.
а это, случаем, не оно?
Цитата Сообщение от Хрисипп Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// h1
#include "h2.h"
#ifndef h1
#define h1
class A{
public:
virtual ~A()=0;
};
A::~A(){}
#endif
 
//h2
#ifndef h2
#define h2
#include "h1.h"
class B : A {};
#endif
 
//main cpp
#include "h1.h"
только защищенное
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
13.07.2016, 20:22 10
Цитата Сообщение от Хрисипп Посмотреть сообщение
а это, случаем, не оно?
Оно. Но оно разрывается include-guard`в h2.
Я же сказал тебе как делать правильно, в чем проблема-то? Зачем, кстати, вообще нужно циклически включать? Это в любом случае нехорошо.
0
19 / 29 / 13
Регистрация: 09.02.2016
Сообщений: 230
13.07.2016, 20:39  [ТС] 11
Цитата Сообщение от DrOffset Посмотреть сообщение
Зачем, кстати
осталось со времени, когда разбирался как устроены эти ifdef'ы. этот проект так и остался для сравнения с vs
0
13.07.2016, 20:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.07.2016, 20:39
Помогаю со студенческими работами здесь

Виртуальный деструктор, для чего нужен?
Я конечно понимаю, что Но объясните поподробнее и попонятнее для чего это нужно

Вопрос новичка про виртуальный деструктор
Если инициализировать указатель родительского класса адресом объекта дочернего класса и объявить в...

Виртуальный деструктор вызывается два раза
Здравствуйте, у меня есть базовый и производный классы с динамическими массивами, я создаю массив...

Почему виртуальный деструктор вызывается дважды?
Непонятно: #include &lt;iostream&gt; #include &lt;conio.h&gt; #include&lt;string&gt; using namespace std;...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru