【发布时间】:2020-05-19 18:57:56
【问题描述】:
我有一个类 Servicii 是空的,还有 2 个类 Car 和 Book(我稍后将用于租用更多类型的服务)扩展这个类。我还有另一堂课 Person 。
之后我声明了一个地图std::map<Person*,Servicii*> servicii; 和这个函数:
template<class T>
void rentService(Person *p,T service)
{
if (typeid(*service).name() == typeid(Car).name()) {
if(p->checkDriverLicense()==true)
{
std::cout<<"Name:"<<p->getName()<<std::endl;
servicii.insert(std::make_pair(p,service));
}
}
}
在 main 我创建了一些对象:
Car *c1=new Car("Skoda",150,true,"red",2014);
Person *p1=new Person("Ale",22);
rentService(p1,c1);
print(servicii);
和打印功能:
void print(std::map<Person*,Servicii*> m) {
for(auto const &it: m) {
std::cout << "[" << it.first << "," << it.second << "]" << std::endl;
}
}
当我编译时这是打印出来的:
Name:Ale
[0x1ba840,0x1ba4b8]
为什么我在地图上有地址?
【问题讨论】:
-
因为指针是-内存中的地址。
-
您有一张
Person*和Servicii*的地图。换句话说,你有一个指针映射。如果你想看到名字,你需要做it.first->getName(),类似于你在rentService()做的事情。您期望/想要打印什么? -
我有rentService(p1,c1)所以在rentService中p1是p,c1是T。所以如果p有驾照,把这个人(p1)和他租的车(c1)插入地图。
-
旁注:
void print(std::map<Person*,Servicii*> m)最好是void print(const std::map<Person*,Servicii*>& m),以避免在打印之前复制整个地图。
标签: c++ class dictionary object