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::begina::end,因为它们会在地图为空时被初始化。 iter-&gt;second-&gt;getName() 至于您当前的问题,您可能需要阅读a good std::map reference 及其迭代器,以及一般的迭代器。 嗨@JoachimPileborg,我应该放什么?我已经编辑了代码以反映下面的更改,但是在我的 for 循环中没有打印任何内容,所以我想说当地图为空时迭代器被初始化是正确的。 【参考方案1】:

首先,当您编写iter = fruitBowl.getBeginIter(); 时,iter 是一个迭代器。这是一个类似指针的对象。如果要访问指向对象的方法,必须先取消引用。

第二,std::map&lt;foo, bar&gt;中包含的对象是foo, barstd::pairs。

所以用法看起来像

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 方法创建的类中获取数据

OpenGL 帧缓冲函数不能在单独的类中完全工作

在单独的类中删除带有按钮的文本框

如何通过 getter 函数序列化包含指针的类?

c ++ templates为特定类型的类调用特定的构造函数

UITableView - 从单独的类中重新加载数据