2016-10-29 44 views
-1

这是一个更具体的问题,关于我似乎遇到的这个任务的问题。基本上,说明是使用STL(而不是链接列表)创建一个列表。在这些例子中我看到的东西,如:C++列表未被识别为容器?

#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();

我收到一个错误,说“开始”不是AnyList的成员。我查了一下问题可能是什么,好像它是由list1不是一个实际的容器引起的?从它看起来应该是由insertFront创建的列表的容器,但它不认识它。

列表是如何实现的?或者是insertFront没有正确完成?实际上,我试图用该行来运行程序的全部原因是为了了解insertFront是否正常工作,但现在我不知道错误在哪里。我见过的大多数示例都是在一个文件中声明的,而不必在类中实现,因此在这一点上该赋值非常混乱。

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

编辑:另外我确实需要一些关于如何在这里正确初始化变量“ptr”的帮助,因为据说这也可能是阻止大量工作的问题。

+0

问题是,'AnyList'从字面上不提供'begin'方法。我的意思是,你有这个声明:它支持'getNumOfElem','insertFront','forwardPrint'。而已。 – melpomene

+0

也许尝试自己做这个任务?你似乎试图为你写,这是一次愚蠢的错误。 – juanchopanza

+0

我试图做到这一点,这是它的开始。我的意思是,如果我知道如何解决出现的问题,这些问题就没有必要了。 – BaloneyOs

回答

0
AnyList list1, list2; 

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

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

为此,AnyList类必须实现一个名为begin()的类方法,该方法返回list<int>::const_iterator

问题中显示的AnyList类的声明表示此类不实现任何称为begin()的方法。 AnyList类仅实现三种类方法,分别命名为getNumOfElem(),insertFront()forwardPrint()

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

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

+0

我明白了,感谢您的输入!为什么它需要在该类中定义,而不是在课外(如示例中那样)? – BaloneyOs

+0

什么样的例子?这里没有例子定义'begin()'/'end()',等等。 “在课外”。 –

+0

在我的文章中的第一个代码块(与向量)。我看到的示例文件(或在线示例)都没有在其中的任何一个中定义begin()。 – BaloneyOs