C ++列表未被识别为容器?

时间:2016-10-29 23:05:05

标签: c++ list iterator

这是一个关于我似乎遇到的问题的更具体的问题。基本上,指令是使用STL(而不是链表)创建列表。在示例中,我看到的内容如下:

#include <vector>
#include <iterator>

vector<char> container = { 'A','B','C','D','E' };

    cout << "Print vector using an iterator: ";
    vector<char>::iterator iter = container.begin();    
    while (iter != container.end())
    {
        cout << *iter << " ";
        ++iter;
    }
    cout << endl;                   // OUTPUT: A B C D E        

当我尝试在我的任务的Main.cpp文件中执行时:

#include "AnyList.h"

#include <iostream>
#include <vector>
#include <iterator>

using namespace std;

int main()
{
    AnyList list1, list2;

    list1.insertFront(10);
    list1.insertFront(11);
    list1.insertFront(12);
    list1.insertFront(13);
    list1.insertFront(14);

    list<int>::const_iterator iter = list1.begin();

AnyList.h

#ifndef ANYLIST_H
#define ANYLIST_H

#include<iostream>
#include <string>   
#include <list>

#include <vector>
#include <iterator>

class AnyList
{
public:

    AnyList();

    int getNumOfElem() const;

    void insertFront(int data);
    void forwardPrint();

private:
    list<int> *ptr; 
};

#endif

AnyList.cpp

#include "AnyList.h"
#include <vector>
#include <iterator>

AnyList::AnyList() 
{

}

int AnyList::getNumOfElem() const
{
    return static_cast<int>(ptr->size());
}

void AnyList::insertFront(int data)
{
    ptr->push_front(data);
}

void AnyList::forwardPrint()
{
    list<int>::const_iterator i;
    for (i = ptr->begin(); i != ptr->end(); ++i)
    {
        cout << *i << " ";
        cout << endl;
    }
}

在主文件中,为行:

list :: const_iterator iter = list1.begin();

我收到错误消息说&#34;开始&#34;不是AnyList的成员。我查了一下这个问题是什么,看起来它似乎是由于list1不是一个真正的容器?从它看起来它应该是insertFront创建的列表的容器,但它没有识别它。

列表的实施方式是否有错误?或者insertFront未正确完成?实际上,我试图用该行运行程序的全部原因是看看insertFront是否正常工作,但是现在我不知道错误在哪里。我见过的大多数例子都是在一个文件中声明的,而不必在一个类中实现它,所以这个赋值在这一点上非常混乱。

还要澄清一些潜在的误解: - AnyList类,私有成员变量和getNumOfElem函数已包含在文件中,getNumOfElem作为实际实现示例提供。

编辑:我还需要一些关于如何正确初始化变量的帮助&#34; ptr&#34;在这里,因为据说这也可能是阻止这一切发挥作用的问题。

1 个答案:

答案 0 :(得分:0)

AnyList list1, list2;

list<int>::const_iterator iter = list1.begin();

此代码调用begin()对象的list1方法。 list1AnyList类的实例。

要使其正常工作,AnyList类必须实现一个名为begin()的类方法,该方法返回list<int>::const_iterator

问题中显示的AnyList类的声明表明此类未实现任何名为begin()的方法。 AnyList类仅实现三个类方法,名为getNumOfElem()insertFront()forwardPrint()

容器不是C ++中的某种自动魔法概念,它可以自动适用于任何类。容器只是它自己的普通类(模板类,但这里不相关),使用普通方法。

如果AnyList类应该像容器一样运行,并且可以使用其他可以与容器一起使用的C ++库算法和模板,那么AnyList类必须满足C ++容器的所有要求,其中包括定义自己的begin()end()方法以及其他方法,以及定义一些内部类型。