C ++ - 通过getter函数在一个单独的类中从对象指针映射访问成员函数

时间:2014-12-11 09:43:03

标签: c++ pointers map iterator

我是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()

我认为我在我的驱动程序类中分配迭代器时遇到了什么问题,但究竟我究竟做错了什么?

2 个答案:

答案 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循环迭代存储在地图内的内容。

再次感谢回复,我仍然会在没有你所有输入的情况下被困住。这两个答案对我有同等帮助,但我认为我只能将其中一个作为最能帮助我的人。我对我的原始问题没有正确格式化表示道歉,这是我的第一篇文章 - 我会尽力确保我的下一个问题。