如何使用迭代器在列表

时间:2017-11-14 18:05:20

标签: c++ class object printing

我目前有一个创建对象的程序。我可以看到使用我所拥有的describe方法成功创建了该对象。我把这个对象放到一个列表中:

list<GameObject*> roomObjects5;
auto * obj1 = new GameObject(&o1name,&o1desc,&o1key);
roomObjects5.push_back(obj1);

我现在正尝试使用迭代器打印这个名为roomObjects 5的列表:

  void print(const list<GameObject>& s) {
        list<GameObject>::iterator i;
        for( i = s.front(); i != s.end(); ++i)
            cout << *i << " ";

        cout << endl;
    }

但是有错误

  

类'const gameObject'与之不兼容   class'list:迭代

  

二元运算符'&lt;&lt;'不能应用于表达式'ostream'和   '游戏对象'

当我跑步时,我得到错误:

错误:在'{'标记之前不允许使用函数定义      void print(const list&amp; s){                                            ^

  

mingw32-make.exe [3]: * [CMakeFiles / textadv.dir / main.cpp.obj]错误1   CMakeFiles \ textadv.dir \ build.make:61:目标配方   mingw32-make.exe [2]'CMakeFiles / textadv.dir / main.cpp.obj'失败:   [CMakeFiles / textadv.dir / all]错误2 CMakeFiles \ Makefile2:66:食谱   目标'CMakeFiles / textadv.dir / all'失败mingw32-make.exe [1]:    [CMakeFiles / textadv.dir / rule]错误2 CMakeFiles \ Makefile2:78:目标'CMakeFiles / textadv.dir / rule'的配方失败   mingw32-make.exe:* [textadv]错误2 Makefile:117:食谱   目标'textadv'失败

有人可以帮我吗?

更新:

> void print(const list<GameObject>& s) {
>     list<GameObject *>::iterator i;
>     for (i = s.front(); i != s.end(); ++i)
>         cout << *(*i) << " ";
> 
>     cout << endl; }

我现在正在尝试这个,我收到了错误

  

类'const GameObject'与类不兼容   名单:迭代'

更新2:

我现在正在尝试这个:

void print(const list&amp; s){     list :: iterator i;

for(auto i = s.front(); i != s.end(); ++i)
    cout << *(*i) << " ";
    cout << endl;

}

并使用

获取错误
i != s.end

  

'无法比较结构'

++i
  

GameObject类型的表达既不是数字也不是指针

*(*i)
  

'指针类型是必需的'

1 个答案:

答案 0 :(得分:1)

根据list::front()上的文档:

  

返回对列表容器中第一个元素的引用。

     

与成员list :: begin不同,它返回一个迭代器到同一个元素,这个函数返回一个直接引用。

     

在空容器上调用此函数会导致未定义的行为。

而不是使用front()使用返回迭代器的begin()。此外, 您正在传递const list<GameObject>&,原始列表为list<GameObject*>。您的功能无法接受您的列表。代码看起来像:

 void print(const list<GameObject*>& s) {
     for (auto i = s.begin(); i != s.end(); ++i)
          cout << *(*i) << " "; 
     cout << endl;
 }

更新:您似乎没有超载ostream& operator << (ostream& out, GameObject& gObj)。你应该定义它:

ostream& operator << (ostream& out, GameObject& gObj){
    out << gObj.(whatever you want to print out from GameObject);
    return out;
}

更新2:

我已经制作了一个用于测试的虚拟代码,它运行正常:

#include <iostream>
#include <list>

using namespace std;

class Noob {
public:
  int bad_data;
};

ostream& operator << (ostream& s, Noob& noob) {
  s << noob.bad_data;
  return s;
}

void print(const list<Noob*> list) {
  for (auto i = list.begin(); i != list.end(); ++i)
    cout << *(*i) << " ";
}

int main() {
  list<Noob*> list;
  for (int i = 0; i < 10; i++)
    list.push_back(new Noob());

  print(list);
  return 0;
}

输出继电器:

0 0 0 0 0 0 0 0 0 0