我是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()
我认为我在我的驱动程序类中分配迭代器时遇到了什么问题,但究竟我究竟做错了什么?
答案 0 :(得分:2)
首先,当你编写iter = fruitBowl.getBeginIter();
时,iter
是一个迭代器。这是一个类似指针的对象。如果要访问指向对象的方法,必须先取消引用它。
其次,std::map<foo, bar>
中包含的对象是std::pair
的{{1}}。
所以用法看起来像
foo, bar
第一个取消引用是访问for(iter = fruitBowl.getBeginIter(); iter != fruitBowl.getEndIter(); iter++){
auto pFruit = (*iter).second;
cout << (*pFruit).getName() << " "
<< (*pFruit).getQuantity() << endl;
}
中键值对的value
;
第二个是访问指针引用的map
。
或者,使用语法糖进行指针操作:
Fruit
答案 1 :(得分:0)
感谢回复人员,感谢您的帮助。
原来这是一个相对简单的问题并且修复了大多数初学者编程错误。我错误解释了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循环迭代存储在地图内的内容。
再次感谢回复,我仍然会在没有你所有输入的情况下被困住。这两个答案对我有同等帮助,但我认为我只能将其中一个作为最能帮助我的人。我对我的原始问题没有正确格式化表示道歉,这是我的第一篇文章 - 我会尽力确保我的下一个问题。