Anfängerprobleme mit Headerdatei



  • Hallo zusammen,
    ich habe gerade grundlegende Probleme bei der Verwendung von Headerdateien:

    Meine main:

    #include <stdio.h>
    #include <Button.hpp>
    
    int main(int argc, char **argv)
    {
    
    	Button Testbutton(2,false);
    
    	printf("hello world\n");
    	return 0;
    }
    

    Meine Header Datei: Button.hpp

    #ifndef _button_hpp_
    #define _button_hpp_
    
    class Button{
    public:
    	Button(int ID,bool Status);
    
    private:
    	int ButtonID;
    	bool InspectionStatus;	
    
    };
    
    #endif _button_hpp_
    

    und die Implementierung in Button.cpp

    #include <Button.hpp>
    
    Button::Button(int ID,bool Status)
    {
    	ButtonID=ID;
    	InspectionStatus=Status;
    	printf("Konstruktor\n");
    }
    

    Beim Compilen wird jedoch folgender Fehler ausgegeben:

    main.cpp:8: undefined reference to `Button::Button(int, bool)'

    Ich bin mir sicher, dass es ein dummer Anfängerfehler ist, aber ich verstehe nicht, wieso das Linken nicht klappt. Die Funktion ist ja offensichtlich definiert. Wenn ich den Konstruktor in der Header-Datei definiere gibt es keine Probleme.

    Da es das erste mal ist, dass ich mit Headerdateien arbeite auch gleich noch eine Frage: Ist das so ein sauberer Stil oder habe ich igendetwas wichtiges vergessen das man noch in den Header reinschreiben sollte?



  • Ok. Ich denke ich habe das Problem selbst gelöst. Die Button.cpp musste explizit zu den Quellcode-Dateien hinzugefügt werden um mitkompiliert zu werden.
    Jetzt die nächste Frage:

    Wo füge ich bei sauberer Implementierung die verwendeten Includes in meiner Klasse ein? In die Header-Datei oder in die cpp DAtei?



  • Faustregel: sowenig wie möglich in den Header.

    Verwende cout statt printf.

    Wenn printf, dann cstdio statt stdio.h.



  • NicolasKuchen schrieb:

    Da es das erste mal ist, dass ich mit Headerdateien arbeite auch gleich noch eine Frage: Ist das so ein sauberer Stil oder habe ich igendetwas wichtiges vergessen das man noch in den Header reinschreiben sollte?

    Ganz gut soweit, außer zwei Kleinigkeiten zum Präprozessor: 1. akzeptiert #endif keine Argumente und 2. ist _button_hpp_ kein gültiger Bezeichner, denn alle globalen Bezeichner, die mit einem Unterstrich beginnen, gehören der Implementierung. Ferner ist es gewöhnlich, Makros in Capslock zu schreiben. Ich pers. hänge gern noch ein _INCLUDED an. Das sähe bei dir dann etwa so aus: BUTTON_HPP_INCLUDED

    NicolasKuchen schrieb:

    Wo füge ich bei sauberer Implementierung die verwendeten Includes in meiner Klasse ein? In die Header-Datei oder in die cpp DAtei?

    So wenig wie möglich im Header, den Rest in der Source-Datei. Je mehr du im Header du inkludierst, desto stärker müllst du den globalen Namensbereich zu und desto länger dauert auch das Kompilieren. Wenn du jedoch nur in der cpp-Datei inkludierst, dann hast du diese Probleme nicht.

    LG



  • Super, Vielen Dank euch beiden! Solche Tipps helfen viel weiter, weil ich mir eienn sauberen Stil angewöhnen will.
    Eine weitere Frage:

    Nach welchem System benennt man die Parameter Namen die z.B. dme Konstrutkor übergeben werden und die Namen der Membervariablen der Klasse?

    Also z.B. Parametername im Konstruktor "_a", Membervariable "a" ?



  • Ich nenne die Parameter gleich wie die Member. Das funktioniert wenn man die Member Initializer List verwendet:

    Button::Button(int ButtonID,bool InspectionStatus)
        : ButtonID(ButtonID), InspectionStatus(InspectionStatus)
    {
        std::cout << "Konstruktor\n";
    }
    

    Was ich auch schon gesehen habe, ist, dass Leute ein the davorschreiben. Sprich z.B. theButtonID. Diese Konvention mag ich persönlich aber nicht.



  • NicolasKuchen schrieb:

    Also z.B. Parametername im Konstruktor "_a", Membervariable "a" ?

    Vorsicht mit solchen Fragen! Die haben schon Kriege ausgelöst 😉

    Ich verwende in der Regel keine spezielle Kennzeichnung für Member.


Log in to reply