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« angefordert

    Meine 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:

    1. schau dir für deinen Konstruktor mal das Thema "Initialisierungsliste" an.
    2. 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.
    3. 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!


Anmelden zum Antworten