2016-10-29 2 views
-1

Dies ist eine spezifischere Frage zu einem Problem, mit dem ich bei dieser Aufgabe konfrontiert bin. Grundsätzlich besteht die Anweisung darin, eine Liste mit der AWL (anstelle einer verketteten Liste) zu erstellen. In den Beispielen sehe ich Sachen wie:C++ Liste nicht als Container erkannt?

#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   

Während ich versuche, in der Main.cpp Datei von meiner Aufgabe zu tun:

#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; 
    } 
} 
In der Hauptdatei für die Zeile:

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

Ich bekomme eine Fehlermeldung, dass "begin" kein Mitglied von AnyList ist. Ich habe nachgeschaut, was das Problem sein könnte und es scheint, dass es dadurch verursacht wird, dass list1 kein Container ist? Von was es aussieht, sollte es ein Container für eine Liste sein, die von insertFront erstellt wird, aber es erkennt es nicht.

Gibt es einen Fehler bei der Implementierung der Liste? Oder ist insertFront nicht korrekt? Eigentlich ist der Grund, warum ich versucht habe, das Programm mit dieser Zeile auszuführen, darin zu sehen, ob insertFront richtig funktioniert, aber im Moment habe ich keine Ahnung, wo der Fehler liegt. Die meisten Beispiele, die ich gesehen habe, sind in einer Datei deklariert, ohne sie in einer Klasse implementieren zu müssen, daher ist diese Zuweisung zu diesem Zeitpunkt sehr verwirrend.

Auch einige mögliche Missverständnisse zu klären: - die AnyList-Klasse, die private Member-Variable und die Funktion getNumOfElem wurden bereits in der Datei enthalten und getNumOfElem wird als ein tatsächliches Implementierungsbeispiel bereitgestellt.

Edit: Auch brauche ich etwas Hilfe, wie man die Variable "ptr" hier richtig initialisiert, denn angeblich könnte das auch das Problem sein, das das Los davon verhindert zu arbeiten.

+0

Das Problem ist, dass 'AnyList' wörtlich keine 'Begin'-Methode bietet. Ich meine, Sie haben die Deklaration genau dort: Es unterstützt 'getNumOfElem',' insertFront', 'forwardPrint'. Das ist es. – melpomene

+0

Vielleicht versuchen, diese Aufgabe selbst zu erledigen? Du scheinst versucht zu haben, es für dich zu schreiben, einen dummen Fehler zu einer Zeit. – juanchopanza

+0

Ich versuche das zu tun und das ist der Anfang davon. Ich meine, wenn ich wüsste, wie man die Probleme löst, die auftauchen, wären diese Fragen nicht notwendig. – BaloneyOs

Antwort

0
AnyList list1, list2; 

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

Dieser Code ruft die begin() Methode des list1 Objekt. list1 ist eine Instanz der Klasse AnyList.

Damit dies funktioniert, muss die Klasse AnyList eine Klassenmethode namens begin() implementieren, die list<int>::const_iterator zurückgibt. Die in der Frage gezeigte Deklaration der Klasse AnyList zeigt an, dass diese Klasse keine Methode namens begin() implementiert. Die Klasse AnyList implementiert nur drei Klassenmethoden mit den Namen getNumOfElem(), insertFront() und forwardPrint().

Ein Container ist keine Art von automatischem magischen Konzept in C++, das automatisch mit jeder Klasse funktioniert. Ein Container ist nur eine gewöhnliche Klasse (eine Template-Klasse, aber das ist hier nicht relevant), mit gewöhnlichen Methoden.

Wenn AnyList Klasse wie ein Container verhalten soll, und die Arbeit mit dem Rest von C++ Bibliothek Algorithmen und Vorlagen, die mit dem Behälter verwendet werden kann, die AnyList Klasse alle Anforderungen an ein C erfüllen muss ++ Container, der seine eigene definieren umfasst begin() und end() Methoden und andere Methoden sowie einige innere Typen definieren.

+0

Ich sehe, danke für die Eingabe! Warum muss es in dieser Klasse definiert werden, aber nicht außerhalb der Klasse (wie im Beispiel)? – BaloneyOs

+0

Welches Beispiel? Es gibt hier kein Beispiel, das 'begin()'/'end()', et al. "Außerhalb der Klasse". –

+0

Im ersten Block von Code in meinem Beitrag (mit den Vektoren). Keine der Beispieldateien (oder Online-Beispiele), die ich sehe, haben in einem von ihnen begonnen(). – BaloneyOs

Verwandte Themen