У меня есть интерфейс, представляющий абстрактный тип данных «Сумка». Чтобы реализовать этот абстрактный тип данных, я использовал реализацию на основе массива и связанную.
Здесь определение класса
редактировать Как вы указали, я добавил виртуальный деструктор в свой базовый класс
template<class ItemType>
class BagInterface{
public:
virtual int getCurrentSize() const = 0;
virtual bool isEmpty() const = 0;
virtual bool add(const ItemType& newEntry) = 0;
virtual bool remove(const ItemType& anEntry) = 0;
virtual int getFrequencyOf(const ItemType& anEntry) const = 0;
virtual bool contains (const ItemType& anEntry) const = 0;
virtual void clear() = 0;
virtual vector<ItemType> toVector() const = 0;
virtual ~BagInterface() = default;
};
#endif /* BagInterface_hpp */
И мои 2 производных класса реализуют эти методы на своем пути.
В моей реализации на основе ссылок используется виртуальный деструктор, потому что, в отличие от реализации на основе массива, он динамически выделяет память, и в конечном итоге он должен удалить экземпляр с помощью ключевого слова «удалить», чтобы избежать утечек памяти.
деструктор связанного мешка
template<class ItemType>
LinkedBag<ItemType>::~LinkedBag(){
clear(); // Clears bag's content.
}
деструктор массива
template<class ItemType>
ArrayBag<ItemType>::~ArrayBag(){
clear();
}
После всех проблем с реализацией я хотел проверить свои операции с ADT.
Я создал функцию, которая принимает указатель в качестве входных данных для представления сумки.
void bagTester(BagInterface<int>* bagPtr){
// do some test }
в моей основной функции, после того, как я закончил свой тест, я хотел удалить свой bagPtr, потому что я закончил с ним, поэтому пришло время его удалить.
int main(){
BagInterface<int>* bagPtr = nullptr;
char userChoice;
cin>> userChoice;
if(userChoice == 'A'){
bagPtr = new ArrayBag<int>(); // Array based implementation
}else if(userChoice == 'L'){
bagPtr = new LinkedBag<int>(); // Link bases implementation
}
bagTester(bagPtr); // test my bag
delete bagPtr; // and now i'm finished with test let's delete the pointer
bagPtr = nullptr; // deallocate
}
**В этом месте возникает моя ошибка, компилятор выдает предупреждение -› **
In file included from main.cpp:2:
In file included from ./LinkedBag.hpp:5:
./BagInterface.hpp:36:31: warning: defaulted function definitions are a C++11 extension [-Wc++11-extensions]
virtual ~BagInterface() = default;
^
In file included from main.cpp:4:
./ArrayBag.hpp:28:5: error: exception specification of overriding function is more lax than base version
~ArrayBag();
^
main.cpp:48:22: note: in instantiation of template class 'ArrayBag<int>' requested here
bagPtr = new ArrayBag<int>();
^
./BagInterface.hpp:36:13: note: overridden virtual function is here
virtual ~BagInterface() = default;
^
In file included from main.cpp:2:
./LinkedBag.hpp:25:1: error: exception specification of overriding function is more lax than base version
~LinkedBag();
^
main.cpp:52:22: note: in instantiation of template class 'LinkedBag<int>' requested here
bagPtr = new LinkedBag<int>();
^
./BagInterface.hpp:36:13: note: overridden virtual function is here
virtual ~BagInterface() = default;
^
1 warning and 2 errors generated.
Я проверил эту связанную тему - › Подавить предупреждение об удалении невиртуального dtor при использовании защищенного невиртуального деструктора
И я попробовал одно из предложений, которое было указано там, а именно:
Правило № 4: Деструктор базового класса должен быть либо общедоступным и виртуальным, либо защищенным и невиртуальным.
А также попытался добавить виртуальный деструктор в BagInterface, но это не сработало (редактирование: я узнал, что должен добавить виртуальный деструктор :))
Я не понимаю проблемы, потому что оба производных класса имеют свой собственный деструктор, у arrayBag есть деструктор по умолчанию, у linkedBag есть виртуальный деструктор.
Итак, как я могу избежать предупреждения?
delete bagPtr
? - person user   schedule 16.10.2020BagInterface
— правильное решение. Не могли бы вы отредактировать свой вопрос, чтобы показать этот код и спросить об ошибках, которые он генерирует? (Я бы даже начал с этого и переместил большую часть контекста после вопроса. Заинтересуйте людей сразу, вместо того, чтобы задавать им вопрос, идет ли этот вопрос куда-то?) - person JaMiT   schedule 16.10.2020-std=c++11
ко всем вашим командам компиляции. Это избавит от ошибок? А еще лучше обновиться до современной версии. - person n. 1.8e9-where's-my-share m.   schedule 16.10.2020