Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Хрисипп
19 / 29 / 8
Регистрация: 09.02.2016
Сообщений: 217
#1

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

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

не знаю как на прошлых версиях, но на этой не работает чисто виртуальный деструктор. проверялось самым обычным тестом
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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.07.2016, 19:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Виртуальный деструктор на MinGW v4.9.2 (C++):

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

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

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

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

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

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

10
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
13.07.2016, 19:09 #2
Хрисипп, а ключевое слово virtual написать?
0
Хрисипп
19 / 29 / 8
Регистрация: 09.02.2016
Сообщений: 217
13.07.2016, 19:10  [ТС] #3
Цитата Сообщение от DrOffset Посмотреть сообщение
а ключевое слово virtual написать
это я написал, забыл в вопрос вписать
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
13.07.2016, 19:17 #4
Цитата Сообщение от Хрисипп Посмотреть сообщение
multiple definition of `A::~A()'|
Это ошибка линкера. Если определение деструктора находится в заголовочном файле, который подключается в несколько единиц трансляции, то ошибка справедливая. MinGW здесь абсолютно прав, что это не компилирует.
Либо вынеси определение в отдельную единицу трансляции, либо сделай его inline.
0
Хрисипп
19 / 29 / 8
Регистрация: 09.02.2016
Сообщений: 217
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
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
13.07.2016, 19:45 #6
Хрисипп, поясни как ты понимаешь назначение строки номер 2 в h1? Почему он у тебя не под include-guard'ом?

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

Как ни крути - программа остается некорректной, даже если VS ее каким-то чудом собирает. Следовательно в любом случае - оставлять определение не-inline функции в заголовочном файле не стоит.
0
Хрисипп
19 / 29 / 8
Регистрация: 09.02.2016
Сообщений: 217
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
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
13.07.2016, 19:53 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Хрисипп, ответ я тебе дал.
* В заголовочных файлах все содержимое должно быть в обрамлено include-guard`ом.
* В заголовочных файлах определений нешаблонных и не-inline функций быть не должно.
Собственно все.

Добавлено через 3 минуты
Цитата Сообщение от Хрисипп Посмотреть сообщение
тогда бы он сообщил, что deep include (это имеешь в виду?)
Не факт. Зависит от того есть ли циклическое включение. У тебя его нет, насколько ты смог показать.
1
Хрисипп
19 / 29 / 8
Регистрация: 09.02.2016
Сообщений: 217
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
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
13.07.2016, 20:22 #10
Цитата Сообщение от Хрисипп Посмотреть сообщение
а это, случаем, не оно?
Оно. Но оно разрывается include-guard`в h2.
Я же сказал тебе как делать правильно, в чем проблема-то? Зачем, кстати, вообще нужно циклически включать? Это в любом случае нехорошо.
0
Хрисипп
19 / 29 / 8
Регистрация: 09.02.2016
Сообщений: 217
13.07.2016, 20:39  [ТС] #11
Цитата Сообщение от DrOffset Посмотреть сообщение
Зачем, кстати
осталось со времени, когда разбирался как устроены эти ifdef'ы. этот проект так и остался для сравнения с vs
0
13.07.2016, 20:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2016, 20:39
Привет! Вот еще темы с ответами:

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

Подскажите как правильно добавить виртуальный деструктор - C++
Доброго времени суток Подскажите пожалуйста, как правильно добавить виртуальный деструктор в класс Int, Double, String и что он должен...

Как правильно сохранить структуру, унаследованную от структуры, содержащую виртуальный деструктор? - C++
Здравствуйте! Имеется структура: struct Product { int mId; double mCost; int mAmount; Product() {}

Может ли MinGW x64 компилить приложения x32? Или нужно для этого отдельно ещё MinGW х32 качать? - C++
Просто решил поиграться с CodeLite.


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru