为什么当我试图打印地图内容时,我得到的是地址而不是值?在C++中

为什么当我试图打印地图内容时,我得到的是地址而不是值?在C++中,c++,class,dictionary,object,C++,Class,Dictionary,Object,我有一个空的服务等级,还有两个等级的车和书,我将在以后租用更多类型的服务来扩展这个等级。我还有一个班上的人。 之后,我声明了一个map std::map servicii;这个功能是: template<class T> void rentService(Person *p,T service) { if (typeid(*service).name() == typeid(Car).name()) { if(p->checkDriverLicense(

我有一个空的服务等级,还有两个等级的车和书,我将在以后租用更多类型的服务来扩展这个等级。我还有一个班上的人。 之后,我声明了一个map std::map 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));
        }
    }
}
以及打印功能:

void print(std::map<Person*,Servicii*> m) {
    for(auto const &it: m) {
        std::cout << "[" << it.first << "," << it.second << "]" << std::endl;
    }
}

为什么地图中有地址?

您需要取消对指针的引用:

void print(std::map<Person*,Servicii*> m) {
    for(auto const &it: m) {
        std::cout << "[" << *(it.first) << "," << *(it.second) << "]" << std::endl;
    }
}

确保您已经实现了操作符您正在打印指针本身,它是一个地址。 您需要的是取消对指针的引用。 例如:

std::cout << it.first->getName() << "\n";
为什么地图上有我的地址

因为那是你在地图上储存的东西。为key和value指定的类型分别是Person*和Servicii*。这两种类型都是指针。指针存储内存地址

当您将指针插入字符流时,它将以十六进制数打印,但指向字符的指针除外,它的处理方式有所不同

不要使用裸指针。可以使用智能指针,也可以存储为容器的元素。例如,在这种情况下,std::map可能是合适的。

直接回答:

由于映射的键值对是指针,指针是指向某个地址的地址,因此在打印指针时,会得到一个十六进制值,表示指针的地址

建议:


如果你想打印自定义信息,你能做的就是过载,因为指针是内存中的地址。你有一张Person*和Servici*的地图。换句话说,你有一个指针地图。如果你想看到这个名字,你需要这样做。首先->getName,类似于你在rentService中所做的。你期望/想要打印什么?我有rentService p1,c1,所以rentService p1中的p1是p,c1是T。所以如果p有驾驶执照,在地图中插入此人1和他租来的车1。旁注:void printstd::map m与void printconst std::map&m一样更好,以避免在打印之前复制整个地图。旁注:在地图中使用指针作为键几乎从来都不是正确的做法,因为您没有映射到要映射到的人所在的位置。你能想象那会有多有趣吗?一个人去商店取车,被告知:不,史密斯先生。我们不能把你的车给你,因为你站在离你下车时的位置左边两英尺的地方。然后,机修工把你的车交给约翰斯顿先生,因为约翰斯顿站在正确的位置。成员功能按计划进行更改。非常感谢。不客气!不过,这需要一个朋友函数才能起作用。
void print(std::map<Person*,Servicii*> m) {
    for(auto const &it: m) {
        std::cout << "[" << *(it.first) << "," << *(it.second) << "]" << std::endl;
    }
}
std::cout << it.first->getName() << "\n";
Car *c1=new Car("Skoda",150,true,"red",2014);
class Person {
public:
  ostream& operator<<(ostream& os, Person const& person) {
      return os << "I am " << person.m_name << " " << person.m_surname << endl;
  }

private:
  string m_name;
  string m_surname;
};