我有一個類層次結構是這樣的:C++抽象類象std ::地圖鍵
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()
因此,您不能使用抽象cl屁股作爲std::map
的關鍵。據我可以告訴這是因爲地圖複製他們的鍵(通過複製構造函數或賦值運算符),這意味着實例化抽象類(Vehicle
)。同樣,即使你可以,我們仍然會墮入object slicing。
我該怎麼辦?
看來我不能使用指針,因爲有可能是邏輯上相同的Car
S或Truck
S的單獨副本。 (即兩個Car
對象單獨實例化,但它代表了同一輛車和operator==
返回true。我需要這些映射到同一個對象在std::map
。)
爲什麼不給'Vehicle'一個'price'會員?或者使用'map'將模型名稱與價格關聯起來? –
Beta
2011-04-25 05:17:16
@Beta假設這是針對一個給定的搜索(比如說,在一個特定的地理區域)。此外,這並不解決位複製同步問題;如果你有兩個'Car'的實例,只有一個會得到價格。 – 2011-04-25 05:17:58
真車通過註冊號碼和唯一的製造序列號解決此問題。 – 2011-04-25 05:21:47