Programmcode auslagen klappt nicht



  • Hallo,
    ich habe mir eben folgendes Program geschrieben:

    #include <iostream>
    #include <string>
    
    using namespace std;
    class Auto {
    	private:
     		string kennzeichen;
    		int ps;
        public:
            Auto (string s = "", int i = 0){
                kennzeichen = s;
                ps = i;
            }
            void setKennzeichen(string s) {
                kennzeichen = s;
            }
            string getKennzeichen() {
                return kennzeichen;
            }
            void setPs(int i) {
                ps = i;
            }
            int getPs() {
                return ps;
            }
    };
    int main() {
    	Auto meineKarre;
    	meineKarre.setKennzeichen("AC-AB 6666");
    	meineKarre.setPs(6666);
    
    	cout << meineKarre.getKennzeichen() << endl;
    	cout << meineKarre.getPs() << endl;
    
        return 0;
    }
    

    Nun möchte ich das Programm modular gestalten.

    Es sieht nun folgendermaßen aus:
    header.h:

    #ifndef HEADER_H_INCLUDED
    #define HEADER_H_INCLUDED
    
    class Auto {
    
    	private:
    
     		string kennzeichen;
    		int ps;
    
        public:
    
            Auto (string s = "", int i = 0);
            ~Auto();
    
            void setKennzeichen(string s);
            string getKennzeichen();
            void setPs(int i);
            int getPs();
    
    };
    
    #endif // HEADER_H_INCLUDED
    

    klasseKlasse.cpp:

    int Auto::Auto(string s, int i) {
        kennzeichen = s;
        ps = i;
    }
    
    Auto::~Auto();
    
    void Auto::setKennzeichen(string s) {
        kennzeichen = s;
    }
    
    string Auto::getKennzeichen() {
        return kennzeichen;
    }
    
    void Auto::setPs(int i) {
        ps = i;
    }
    
    int Auto::getPs() {
        return ps;
    }
    

    main.cpp:

    #include <iostream>
    #include <string>
    #include "header.h"
    #include "klasseKlasse.cpp"
    
    using namespace std;
    
    int main() {
    
    	Auto meineKarre;
    	meineKarre.setKennzeichen("AC-AB 6666");
    	meineKarre.setPs(6666);
    
    	cout << meineKarre.getKennzeichen() << endl;
    	cout << meineKarre.getPs() << endl;
    
        return 0;
    }
    

    Es werden jede Menge Fehler ausgegeben,
    jeddoch hauptsächlich Fehler bzgl. der Strings.
    Wenn ich in die Header-Datei die string include, ändert das aber nichts.

    Wie läuft das include bei c++ eigentlich ab?
    So wie bei Java?

    Und was mache ich falsch 😕



  • include ist reine textersetzung, dort wo du include<xXx> schreibst wird der gesamte dateiinhalt von deiner xXx datei reingeschrieben, mehr ist das nicht.

    was dir wohl eher fehlt ist ein #include <string> in deine header datei



  • hilft leider nichts

    header.h:

    #ifndef HEADER_H_INCLUDED
    #define HEADER_H_INCLUDED
    
    #include <string>
    
    class Auto {
    
    	private:
    
     		string kennzeichen;
    		int ps;
    
        public:
    
            Auto (string s = "", int i = 0);
            ~Auto();
    
            void setKennzeichen(string s);
            string getKennzeichen();
            void setPs(int i);
            int getPs();
    
    };
    
    #endif // HEADER_H_INCLUDED
    

    Fehler:

    string' does not name a type
    

    edith sagt:
    wenn es reine textersetzung ist, dann dürfte es doch keinen Unterschied machen, ob ich die string in der main.cpp oder in der header.h includiere, oder?



  • Nein, nicht gleich wie bei Java. Ist ein wenig komplizierter.

    Wenn du eine Klasse benutzt (aka Funktionen aufrufst, Objekt erstellst oder in eine andere Klasse einbettest), dann muss die Definition bekannt sein. Sprich du musst den Header vorher inlcude.

    in header.h benutzt du std::string. Also musst du vorher <string> includen. Das std:: musst du dann bei der Benutzung auch angeben (mach kein using namespace in den Header!).

    in klasseKlasse.cpp definierst du die Memberfunktionen von Auto. Also muss da die Definition der Klasse bekannt sein, also muss da ein include "header.h" rein.

    In main.cpp benutzt du direkt lediglich Auto, also musst du da nur include "header.h" rein usw.

    Du solltest mal ein Anfängerbuch zu C++ lesen. Auch wenn du bereits programmieren kannst ist es durchaus notwendig, weil einige Sachen anders laufen, als in Java.



  • int Auto::Auto(string s, int i) {
        kennzeichen = s;
        ps = i;
    }
    

    Kostruktor hat kein Rückgabewert. Nimm das int weg.



  • MiP schrieb:

    int Auto::Auto(string s, int i) {
        kennzeichen = s;
        ps = i;
    }
    

    Kostruktor hat kein Rückgabewert. Nimm das int weg.

    Japp, hab ich auch schon gesehen,
    muss beim formatieren iwie reingerutscht sein. sry.

    Habe den Code jetzt nochmal überarbeitet.
    Bekomme nun 2 neue Fehler.

    header.h:

    #ifndef HEADER_H_INCLUDED
    #define HEADER_H_INCLUDED
    
    #include <string>
    
    class Auto {
    
    	private:
    
     		std::string kennzeichen;
    		int ps;
    
        public:
    
            Auto (std::string s = "", int i = 0);
            ~Auto();
    
            void setKennzeichen(std::string s);
            std::string getKennzeichen();
            void setPs(int i);
            int getPs();
    
    };
    
    #endif // HEADER_H_INCLUDED
    

    klasseKlasse.cpp:

    1. Wenn der Destruktor nicht auskommentiert wird, bekomme ich die Fehlermeldung:
      declaration of 'Auto::~Auto()' outside of class is not definition

    2. folgender Fehler in Zeile 3:
      expected ')' before 's'

    #include "header.h"
    
    Auto(std::string s, int i) {
        kennzeichen = s;
        ps = i;
    }
    
    //Auto::~Auto();
    //Wenn ich den Destruktor hier drin lasse kommt folgende Fehlermeldung:
    //declaration of 'Auto::~Auto()' outsie of class is not definition
    
    void Auto::setKennzeichen(std::string s) {
        kennzeichen = s;
    }
    
    std::string Auto::getKennzeichen() {
        return kennzeichen;
    }
    
    void Auto::setPs(int i) {
        ps = i;
    }
    
    int Auto::getPs() {
        return ps;
    }
    

    main.cpp:

    #include <iostream>
    #include "header.h"
    
    using namespace std;
    
    int main() {
    
    	Auto meineKarre;
    	meineKarre.setKennzeichen("AC-AB 6666");
    	meineKarre.setPs(6666);
    
    	cout << meineKarre.getKennzeichen() << endl;
    	cout << meineKarre.getPs() << endl;
    
        return 0;
    }
    

    Den Fehler in Zeile 3 kapier ich garnicht 😕
    Gehört der Destruktor nur ins header-file?



  • Hallo,

    wenn du den Destruktor außerhalb angeben willst, dann mußt du auch einen Funktionsrumpf (Body) angeben:

    Auto::~Auto()
    {
    }
    

    Jedoch benötigt deine Klasse gar keinen eigenen Destruktor (der vom Compiler generierte Standard-Destruktor reicht völlig aus), also laß ihn einfach weg.
    Stichwort dazu: Regel der großen Drei (Kopierkonstruktor, Zuweisungsoperator, Destruktor) - entweder alle definieren oder aber keinen!



  • // gelöscht (aus Versehen doppelt gepostet)



  • Fishmasta schrieb:

    #include "header.h"
    
    Auto(std::string s, int i) {
        kennzeichen = s;
        ps = i;
    }
    

    Den Fehler in Zeile 3 kapier ich garnicht 😕

    Da stand vorher
    int Auto::Auto(...
    und statt nur "int" wegzunehmen, fehlt jetzt auch das "Auto::"

    Fishmasta schrieb:

    Gehört der Destruktor nur ins header-file?

    Diese Woche ist wohl die "Ich-habe-noch-nie-etwas-von-der-ODR-gehört"-Woche, was?

    Wenn ich mich frägte, was wo definiert und deklariert werden soll, dann würde ich mir ein schlaues Buch schnappen und den Kram nachlesen.




Anmelden zum Antworten