Абстрактный класс C ++ как std :: map key

У меня есть такая иерархия классов:

struct Vehicle {
  virtual string model() = 0; // abstract
  ...
}
struct Car : public Vehicle {...}
struct Truck : public Vehicle {...}

Мне нужно сохранить std :: map с некоторой информацией, которую я получил о некоторых экземплярах Vehicle :

std::map prices;

Однако я получаю следующую ошибку:

/usr/include/c++/4.2.1/bits/stl_pair.h: In instantiation of ‘std::pair’:
/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, _Alloc = std::allocator >]’
test.cpp:10:   instantiated from here
/usr/include/c++/4.2.1/bits/stl_pair.h:73: error: cannot declare field ‘std::pair::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 создаются отдельно, но представляют одну и ту же машину, и operator == возвращает true. Они нужны мне для сопоставления с тем же объектом в std :: map .)

8
задан Adam Ernst 25 April 2011 в 05:10
поделиться