Здравствуйте, гость ( Вход | Регистрация )
Iron Bug | Дата 9.7.2013, 6:44 |
Валидный код: хорошо. может. но в этом нет никакого смысла: получится обычная виртуальная функция, разве что потомок должен будет её переписывать явно. но это можно сделать просто через private-наследование, что будет гораздо логичнее. |
|
Авварон | Дата 8.7.2013, 22:02 |
ты объявил чистый виртуальный деструктор virtual ~Class1() = 0; и тут же реализацию Class1::~Class1(){} понятно, что компилятор ругается 1. реализация НИКОГДА не должна быть в заголовочном файле. только в cpp. 2. у абстрактного метода (а также конструктора или деструктора) не может быть никакой реализации в принципе. У абстрактного метода может быть реализация. Валидный код:
|
|
Алексей1153 | Дата 8.7.2013, 9:42 |
так ты его предоставь ))
|
|
Berg | Дата 5.7.2013, 20:48 |
Всем спасибо за ответы! Проблему решил (по крайней мере компилятор не ругается и все корректно работает) прописав реализацию в mainwindow.cpp. Если убрать строку
компилятор ругается на строчку так: 'Когда гуглил решение проблемы, нашел фрагмент книги "Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ", автор Майерс Скотт http://www.e-reading-lib.com/chapter.php/1...ovanie_CPP.html Цитата class AWOV { // AWOV = “Abstract w/o Virtuals” public: virtual ~AWOV() = 0; // объявление чисто виртуального }; // деструктора Этот класс включает в себя чисто виртуальную функцию, поэтому он абстрактный. А раз в нем объявлен виртуальный деструктор, то можно не беспокоиться о том, что деструкторы базовых классов не будут вызваны. Однако есть одна тонкость: вы должны предоставить определение чисто виртуального деструктора: AWOV::~AWOV(){}; // определение чисто виртуального деструктора Дело в том, что сначала всегда вызывается деструктор «самого производного» класса (то есть находящегося на нижней ступени иерархии наследования), а затем деструкторы каждого базового класса. Компилятор сгенерирует вызов ~AWOV из деструкторов производных от него классов, а значит, вы должны позаботиться о его реализации. Если этого не сделать, компоновщик будет недоволен. |
|
Алексей1153 | Дата 5.7.2013, 9:22 |
Berg, убери вообще строку Class1::~Class1(){} а после закрывающей фигурной скобки класса поставь ; |
|
Iron Bug | Дата 5.7.2013, 9:21 |
1. реализация НИКОГДА не должна быть в заголовочном файле. только в cpp. 2. у абстрактного метода (а также конструктора или деструктора) не может быть никакой реализации в принципе. |
|
Berg | Дата 5.7.2013, 9:14 |
Забыл, когда писал сообщение
Ошибка выскакивает на стоке
Я ведь определил деструктор за пределами класса. Или определять надо в другом файле? Если добавить реализацию деструктора в файл ExClass.h, то те же ошибки на строке
|
|
Алексей1153 | Дата 5.7.2013, 8:57 |
ты объявил чистый виртуальный деструктор virtual ~Class1() = 0; и тут же реализацию Class1::~Class1(){} понятно, что компилятор ругается |
|
Litkevich Yuriy | Дата 5.7.2013, 4:24 |
Class.h:29: ошибка: first defined here и где эта строка, почему не показываешь соответствующее место в коде?class ExClass1 : Class1 почему не указан тип наследования (public, private, ...)? |
|
Berg | Дата 5.7.2013, 0:46 |
Всем привет! Помогите решить проблему. Есть абстрактный класс,от которого наследуется потомок. Никак не могу разобраться с деструкторами Class.h
ExClass.h
Вызов started() mainwindow.cpp
Компилятор ругается
Заранее спасибо за ответы. |
|
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 27.4.2024, 9:13 |