У меня есть иерархия классов, подобная этой:
struct Vehicle {
virtual string model() = 0; // abstract
...
}
struct Car : public Vehicle {...}
struct Truck : public Vehicle {...}
Мне нужно сохранить std::map
с некоторой информацией, которую я получаю о некоторых Vehicle
экземплярах:
std::map<Vehicle, double> prices;
Однако я получаю следующую ошибку:
/usr/include/c++/4.2.1/bits/stl_pair.h: In instantiation of ‘std::pair<const Vehicle, double>’:
/usr/include/c++/4.2.1/bits/stl_map.h:349: instantiated from ‘_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = Vehicle, _Tp = double, _Compare = std::less<Vehicle>, _Alloc = std::allocator<std::pair<const Vehicle, double> >]’
test.cpp:10: instantiated from here
/usr/include/c++/4.2.1/bits/stl_pair.h:73: error: cannot declare field ‘std::pair<const Vehicle, double>::first’ to be of abstract type ‘const Vehicle’
Model.hpp:28: note: because the following virtual functions are pure within ‘const Vehicle’:
Model.hpp:32: note: virtual string Vehicle::model()
Так что вы не можете использовать абстрактный класс в качестве ключа std::map
.Насколько я могу судить, это потому, что карты копируют свои ключи (через конструктор копирования или оператор присваивания), и это подразумевает создание абстрактного класса (Vehicle
).Кроме того, даже если бы вы могли, мы все равно стали бы жертвой нарезки объектов .
Что мне делать?
Кажется, я не могу использовать указатели потому что могут быть отдельные копии логически идентичных Car
с или Truck
с.(т.е. два Car
объекта создаются отдельно, но которые представляют одну и ту же машину, и operator==
возвращает true. Мне нужно, чтобы они отображались на один и тот же объект в std::map
.)