【问题标题】:iterating a list of inherited class c++迭代继承的类 C++ 的列表
【发布时间】:2014-02-11 16:15:32
【问题描述】:

我有两个类继承自第三个类,它们存储在一个列表中。

我正在尝试迭代该列表并调用每个类的已实现函数,但是代码无法编译。

这是我的代码:

class A
{   
   public:

   virtual void foo ()=0;
};

class B :public class A
{
   public:

   void foo();
}

class C :public class A
{
   public:

   void foo();
}

std::list<A*> listOfClasses;

listOfClasses.push_back (new B());
listOfClasses.push_back (new C());

for(std::list<A*>::iterator listIter = listOfClasses.begin(); listIter != listOfClasses.end(); listIter++)
{
    listIter->foo()
}

此代码无法编译,我收到以下错误消息 (for the line listIter-&gt;foo()):

'foo' : is not a member of 'std::_List_iterator&lt;_Mylist&gt;'

任何想法为什么?

【问题讨论】:

  • 试试(*listiter)-&gt;foo()

标签: c++ inheritance iterator stdlist


【解决方案1】:

你必须这样使用迭代器:(*listIter)-&gt;foo()

【讨论】:

  • 这是因为迭代器的作用就像一个指针,它指向的是一个指针。所以有两个间接级别。
【解决方案2】:

您需要先取消对迭代器的引用:

(*listIter)->foo()

【讨论】:

    【解决方案3】:

    对于某些种类,这里有一个更简单的 C++11 替代语法,它完全避免了这个问题:

    for (auto p : listOfClasses)
    {
        p->foo();
    }
    

    【讨论】:

      【解决方案4】:

      您的容器包含指针,因此您需要取消引用它们:

      (*listIter)->foo();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-09
        • 1970-01-01
        • 2016-04-22
        • 2016-12-25
        • 2014-07-18
        • 1970-01-01
        相关资源
        最近更新 更多