【问题标题】:Get an object from a map by reference通过引用从地图中获取对象
【发布时间】:2019-08-02 00:17:03
【问题描述】:

我试图通过引用在 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");

【问题讨论】:

  • 如果fooptrFoo * 类型,问问自己*fooptr 有什么类型。
  • 没有std::hash_map
  • @Brian 对我来说很好。
  • @peer_2_peer_2 你用什么标准库?
  • 好像std::hash_map 确实存在。

标签: c++


【解决方案1】:

在阅读了约翰回答中的 cmets 之后,我想我理解了你的问题。指针调用也是值调用。您复制指针地址。您可以通过引用指针来调用:

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 的地址(值)。

【讨论】:

  • 这也行。我想我只会返回地址本身。
  • 如果我错了,请纠正我...不应该是fooptr = &amp;it-&gt;second;(没有星号)吗?
【解决方案2】:

你对指针感到困惑。

*fooptr = it->second;

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

声明一个对象,传递一个指向该对象的指针,取消引用函数内部的指针。

编辑

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

*fooptr = &it->second;

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

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

这段代码太可怕了。

-2 没什么,我不会担心的。

【讨论】:

  • 我觉得我已经尝试过了,这是我原来的路线。它起作用了,但似乎并没有获得实际的对象——更像是获得了它的副本。我再试一次。。
  • @peer_2_peer_2 当然是获取副本。听起来你需要一个双指针。
  • 我想我只是不明白?我有一个对象住在地图内。该对象有一个地址。那么为什么声明一个指针,然后将它传递给一个函数,然后将该指针的值设置为对象的地址,不起作用呢?
  • 使用Foo * FooManager::GetFoo(std::string name)必须更实用才能获得指向的指针,当然如果找不到则返回nullptr
  • 因为函数中的指针只是函数外指针的副本。如果要更改指针,则需要将指针传递给指针,就像要更改整数需要将指针传递给整数一样。 (参考也有效)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
相关资源
最近更新 更多