C ++ - 通过getter函数在单独的类中从对象指针映射访问成员函数
Posted
技术标签:
【中文标题】C ++ - 通过getter函数在单独的类中从对象指针映射访问成员函数【英文标题】:C++ - Accessing member functions from a map of object pointers, in a seperate class via getter functions 【发布时间】:2014-12-11 09:43:03 【问题描述】:我对 C++ 还很陌生,我试图自己解决这个问题,但无法完全做到。
我在一个类中定义了一个指向一组动态分配对象的指针映射,其中字符串作为键,还有两个迭代器(begin() 和 end()),以及对应于每个迭代器的两个 getter 函数.
class a
std::map<string, Fruit*> fruitSalad;
std::map<string, Fruit*>::iterator begin = fruitSalad.begin(), end = fruitSalad.end();
std::map<string, Fruit*>::iterator getBeginIter() const;
std::map<string, Fruit*>::iterator getEndIter() const;
;
映射中引用的对象及其成员函数需要在单独的驱动程序类中可访问。为了测试我的实现,我一直在尝试使用 for 循环从对象中打印值,方法是通过其访问器访问迭代器,如下面的代码所示。
#include "a.h"
int main()
A fruitBowl;
std::map<string, Object*>::iterator iter;
for(iter = fruitBowl.getBeginIter(); iter != fruitBowl.getEndIter(); iter++)
cout << iter.getName() << " " << iter.getQuantity() << endl;
但我收到以下错误
error: 'std::map<std::basic_string<char>, Fruit*>:: iterator' has no member named getName()
error: 'std::map<std::basic_string<char>, Fruit*>:: iterator' has no member named getQuantity()
我认为我在驱动程序类中分配迭代器时做错了,但我到底做错了什么?
【问题讨论】:
您为什么不想在点击“提交”之前使用实时帖子预览来确保您的帖子实际格式正确? 希望大家不要使用a::begin
和a::end
,因为它们会在地图为空时被初始化。
iter->second->getName()
至于您当前的问题,您可能需要阅读a good std::map
reference 及其迭代器,以及一般的迭代器。
嗨@JoachimPileborg,我应该放什么?我已经编辑了代码以反映下面的更改,但是在我的 for 循环中没有打印任何内容,所以我想说当地图为空时迭代器被初始化是正确的。
【参考方案1】:
首先,当您编写iter = fruitBowl.getBeginIter();
时,iter
是一个迭代器。这是一个类似指针的对象。如果要访问指向对象的方法,必须先取消引用。
第二,std::map<foo, bar>
中包含的对象是foo, bar
的std::pair
s。
所以用法看起来像
for(iter = fruitBowl.getBeginIter(); iter != fruitBowl.getEndIter(); iter++)
auto pFruit = (*iter).second;
cout << (*pFruit).getName() << " "
<< (*pFruit).getQuantity() << endl;
第一个解引用是访问map
中键值对的value
;
第二种是访问指针引用的Fruit
。
或者,使用句法糖进行指针操作:
for(iter = fruitBowl.getBeginIter(); iter != fruitBowl.getEndIter(); iter++)
auto pFruit = iter->second;
cout << pFruit->getName() << " "
<< pFruit->getQuantity() << endl;
【讨论】:
【参考方案2】:感谢大家的回复,感谢您的帮助。
原来这是一个相对简单的问题,并像大多数初学者编程错误一样修复。我在线程前面误解了 Joachim Pileborg 的评论——我实际上是使用 begin() 和 end() 开始的,尽管这条评论确实让我走上了正确的思路。
问题是,虽然我用从迭代器函数 begin() 和 end() 返回的迭代器初始化了我命名为“begin”和“end”的迭代器,但我在定义映射后立即这样做了,在它包含任何值之前 - 如下所示。
std::map<string, Fruit*> fruitSalad;
std::map<string, Fruit*>::iterator begin = fruitSalad.begin(), end = fruitSalad.end();
所以我想这意味着我的迭代器都指向同一个内存位置,所以当我通过驱动程序类中的 getter 访问这些迭代器时,for 循环将在它开始时立即终止,这就是为什么没有值即使在修复了 mookid 指出的我的代码中的原始错误之后,也会被打印出来。
为了解决这个问题,我只是在构造函数中初始化了类 a 中的指针值,这是从文件中读取映射值的位置,如下所示。
// class a constructor
a()
... // initialise some other variables
loadFruitValues(); // reads values in from a .txt file to the map
iter1 = fruitSalad.begin();
iter2 = fruitSalad.end();
现在,当代码运行时,正确返回的迭代器指向地图的开头和结尾,允许 for 循环遍历地图中存储的内容。
再次感谢您的回复,如果没有您的所有意见,我仍然会被卡住。这两个答案都对我有同样的帮助,但我认为我只能将一个作为对我帮助最大的一个。对于我最初的问题格式不正确,我深表歉意,这是我的第一篇文章-我会尽力确保我的下一个问题正确。
【讨论】:
以上是关于C ++ - 通过getter函数在单独的类中从对象指针映射访问成员函数的主要内容,如果未能解决你的问题,请参考以下文章
是否可以从为 getter-setter 方法创建的类中获取数据