Anfängerfrage
-
Hallo,
ich arbeite erstmals in c++ und habe ein Problem mit einer LinkedList aus Instanzen einer selbst programmierten Klasse.Meine Klasse (in Datei Kanten.cpp):
#include <boost/lexical_cast.hpp> using namespace std; class Kante{ public: Kante( int anfang, int ende, int name, Kante *next ); int ende; int anfang; int name; Kante *next; string text; }; Kante::Kante( int anfangN, int endeN, int nameN, Kante *nextN ) { anfang = anfangN; ende = endeN; name = nameN; next = nextN; text = "Line(" + boost::lexical_cast<string>(name) + ") = {" + boost::lexical_cast<string>( anfang ) + ", " + boost::lexical_cast<string>( ende ) + "};"; }Das Testprogramm:
#include <iostream> #include <string> #include <cstdlib> #include "Kanten.cpp" using namespace std; int main() { Kante meineKante = new Kante( 1, 2, 1, NULL ); cout << meineKante.text; }Beim compilieren bekomme ich folgenden Fehler:
KantenTest.cpp: In Funktion »int main()«:
KantenTest.cpp:10:46: Fehler: Umwandlung von »Kante*« in nicht-skalaren Typen »Kante« angefordertMeine Fragen:
1. Wo ist der Fehler?
2. Wie muss ich "this" oder ähnliches verwenden um im Konstruktor die seltsame Variablenbenennung zu umgehen? In Java würde ich schreiben:Kante::Kante( int anfang, int ende, int name, Kante *next ) { this.anfang = anfang; this.ende = ende; this.name = name; this.next = next; this.text = "Line(" + boost::lexical_cast<string>(name) + ") = {" + boost::lexical_cast<string>( anfang ) + ", " + boost::lexical_cast<string>( ende ) + "};"; }Hier führt das leider zum Fehler: Kanten.cpp:19:7: Fehler: Abfrage des Elementes »anfang« in »this«, das vom Nicht-Klassentyp »Kante* const« ist
Vielen Dank für Hinweise!
-
Warum verwendest du new?
Wenn du new verwendest musst du das ergebnis auch einem pointer zuweisen. Ansonsten kannstes auch einfach auf dem stack anlegen:
mit pointer:
Kante * meineKante = new Kante( 1, 2, 1, NULL );Aufm stack:
Kante meineKante( 1, 2, 1, NULL );Und zu der stringzusammensetzung verwendest du am besten einen std::stringstream:
#include <sstream> ... std::stringstream ss; ss << "Line(" << name << ... << ...; string text = ss.str();Dann kannste dir sogar die lexical casts sparen
-
Achso, new ----> Pointer
Vielen Dank!
-
fronzenlaf schrieb:
Meine Fragen:
1. Wo ist der Fehler?Schau mal nach, von welchem Typ "meineKante" ist, und schau in dein C++-Buch, welchen Typ new zurückgibt. C++ ist nicht Java.
2. Wie muss ich "this" oder ähnliches verwenden um im Konstruktor die seltsame Variablenbenennung zu umgehen? In Java würde ich schreiben:
Ähnliches Problem wie oben. Schau in deinem Buch nach, von welchem typ this ist. Und wie man mit Pointern umgeht.
Grundsätzlich: vergiss, was du aus Java kennst. Es ist in C++ fast immer ein wenig anders, dein Java-Wissen darfst du nicht auf C++ anwenden, es steht dir dann nur im Weg.
Drei weitere Dinge:
- schau dir für deinen Konstruktor mal das Thema "Initialisierungsliste" an.
- In C++ teilt man den Code in Header (*.h, .hpp) und Sourcen (.C, *.cc, *.cpp) auf. Das Thema musst du dir auch anschauen, man #includet keine Source-Files.
- Du brauchst nicht überall new, um neue Objekte zu erzeugen. C++ ist nicht Java

Schreib dir den Spruch am Besten auf ein großes Schild und häng ihn dir über den Monitor:
C++ IST NICHT JAVA!