klassen und STL
-
Lerne grad die Grundlagen von STL und komme beim Programmieren nicht weiter.
void liste(char *a,char *b){klasse k(a,b);
static std::list<klasse> l;
l.push_back(k);
}Soweit so gut. Ich übergebe 2 strings an die Klasse die sich per Konstruktor erstellt und Pröpfe die in eine doppelt verkettete Liste aus der STL.
Allerdings entsteht hierbei schon das erste Problem. Die Liste inst nicht global, sodass ich gleich probleme kriege wennich sie in der nächsten Funktion ansprechenmöchte zur Ausgabe....
Ich glaub dass das eigentlich elementares C ist sowas hinzukriegen. Aber naja ich hab da wohl gepennt. Lasse mich aber gerne belehren wie ich das Problem löse.
Dachte es ging mit static. Hab mich aber wohl getäuscht.Aber nun zum nächsten Problem
void listeausgabe(){
std::list<klasse>::iterator i;
for (i = l.begin(); i!= l.end(); ++i){
std::cout << *i.print() <<"\n";
}
}Hier hat der die Liste l schon gelöscht. (Das elementare c++ Problem wo ich die Nachhilfe dringend brauche
)
Nun aber zu dem anderen Problemstd::cout << *i.print() <<"\n";
Die Funktion print() gehört zu der Klasse die ich geschriben hab und gibt wie nicht anders zu erwarten die Werte dieich eingetragen hab aus.
Das diese Zeile absoluter Quatsch ist ist mir klar. Ich will aber nun die funktion Print sämtlicher elemente der Liste nacheinander ausgeben. Da haperts. Wie mach ich das?
Freu mich über jede hilfe
MFG
chew
-
chewbo schrieb:
Lerne grad die Grundlagen von STL und komme beim Programmieren nicht weiter.
Ja, schalt erst mal nen Gang zurück, deine Analyse ...
Ich glaub dass das eigentlich elementares C ist sowas hinzukriegen. Aber naja ich hab da wohl gepennt.
... ist vollkommen korrekt. (Wenn auch falsch formuliert, du willst kein elementares C, sondern elementares C++ lernen.)
-
Kurz gesagt: Wenn du lokale Variablen in anderen Funktionen benötigst, mußt du sie dorthin übergeben (das geht per Parameter oder Rückgabewert, je nach Richtung):
void ausgabe(const list<klasse>& l) { for(list<klasse>::iterator i=l.begin();i!=l.end();++i) cout<<i->print()<<endl; } list<klasse> erzeuge() { list<klasse> vals; klasse k(a,b); vals.push_back(k); ... return vals; } int main() { list<klasse> mylist=erzeuge(); ausgabe(mylist); return 0; }
-
Ja da fiels mir doch glatt wie Schuppen aus den Haaren. Und wenn man mehr als ein Elementr zurückgeben will musste man das irgendwie mit Zeigern machen.
Naja. Aber wie nicht anders zu erwarten ist ein neues Problem entstanden.list<klasse> erzeuge() { list<klasse> vals; klasse k(a,b); vals.push_back(k); ... return vals; }so steht das jetzt in etwa auch in meiner *.cpp Datei drin.
Kopfzerbrechen bereitet mir nun meine *.h Datei, denn dort wollte ich den Prtotoyp deklarieren mitlist<klasse> erzeuge()kriege allerdings die Fehlermeldung
c:\Dokumente und Einstellungen\chew\Eigene Dateien\Visual Studio Projects\inputoutput\liste.h(4) : error C2143: Syntaxfehler: Es fehlt ';' vor '<' c:\Dokumente und Einstellungen\chew\Eigene Dateien\Visual Studio Projects\inputoutput\liste.h(4) : error C2501: 'list': Fehlende Speicherklasse oder TypspezifiziererDrum dacht ich mir müsst ich das ding sicherlich dem std Namespace zuordnen
std::list<klasse> erzeuge()Da sagt mmir der gemeine Hund es sei kein Element von std. Was ich stark zu bezweifeln mag.
Wie schreib ich das jetzt syntaktisch korrekt?
-
du brauchst auch ein "#include <list>" in der Headerdatei, damit der Compiler die Liste erkennt (und btw ein ; am Ende des Prototyps).
-
chewbo schrieb:
Ja da fiels mir doch glatt wie Schuppen aus den Haaren. Und wenn man mehr als ein Elementr zurückgeben will musste man das irgendwie mit Zeigern machen.
naja, schau dir das thema aber genau an, bevor du damit arbeitest!
denn unter zurückgeben, und verändern ist ein unterschied!und versuchs mal mit
list<klasse> erzeuge;statt
list<klasse> erzeuge()
-
Gbit der mir die gleiche Fehlermeldung aus. sowohl mit als auch ohne std::....
-
chewbo schrieb:
Gbit der mir die gleiche Fehlermeldung aus. sowohl mit als auch ohne std::....
hast den hinweis von cstoll beachtet?
-
oops das muss ich wohl überscrollt haben.
Sorry. das ist mir jetzt peinlich.Jetzt klappt es. Vielen dank.
wusste garnicht dass man in headerdateien auch headerdateien included.
Man lernt doch täglich dazu.....Vielen dank nochmal. Jetzt komm ich weiter....
chewbo
-
chewbo schrieb:
wusste garnicht dass man in headerdateien auch headerdateien included.
Ja, macht man - wenn man deren Deklarationen für seine eigenen Funktionsprototypen benötigt (schließlich will dein Compiler wissen, was er da machen soll, wenn er eine list<klasse> zurückgeben muß).
-
Ähm noch ein Problem krieg ich hier grade
cout<<i->print()<<endl;Krieg da die Fehlermeldung
c:\Dokumente und Einstellungen\chew\Eigene Dateien\Visual Studio Projects\inputoutput\liste.cpp(31) : error C2679: Binärer Operator '<<': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operator vom Typ 'void' akzeptiert (oder keine geeignete Konvertierung möglich)Kann damit nichzt wirklich wasw anfangen
-
liegt viell daran, das print() void zurückgibt!
das heißt, du solltest es mal ohne dein cout<< probieren!