通过引用从地图获取对象

时间:2019-03-11 16:09:02

标签: c++

我试图通过引用在hash_map内获取对象。看起来很简单,但是我不知道为什么它不能编译。错误为no match for operator=。在我看来,我正在将fooptr的值设置为在地图中找到的Foo对象的地址。

void FooManager::GetFoo(Foo *fooptr, std::string name){
    std::hash_map<std::string, Foo>::iterator it = this->foos.find(name);
    if(it != this->foos.end()){
       *fooptr = &it->second;
    }
}

Foo *foo = 0;
GetFoo(foo, "test");

2 个答案:

答案 0 :(得分:3)

阅读约翰回答中的评论后,我认为我理解您的问题。按指针调用也按值调用。您复制指针地址。您可以通过引用指针来调用:

void FooManager::GetFoo(Foo *&fooptr, std::string name){
    std::hash_map<std::string, Foo>::iterator it = this->foos.find(name);
    if(it != this->foos.end()){
       fooptr = &it->second;
    }
}

Foo *foo = 0;
GetFoo(foo, "test");

现在fooptr是对指针的引用。更改fooptr的地址(值)时,还更改了foo的地址(值)。

答案 1 :(得分:1)

您对指针感到困惑。

*fooptr = it->second;

Foo foo;
GetFoo(&foo, "test");

声明一个对象,将指针传递给该对象,然后在函数内部取消引用该指针。

编辑

根据下面的反馈,答案应该是

*fooptr = &it->second;

Foo* foo = 0;
GetFoo(&foo, "test");

声明指针,将指向该指针的指针传递给函数(双指针),取消引用双指针(以获取指针),并将该指针分配给map元素。

此代码太可怕了。

-2什么都不是,我不会担心。