2016-10-29 69 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