Weiß nicht wo der Fehler liegt...



  • Hi @ all

    hab ein Problem mit einem Funktionsausruf aus einer Klasse, weiß aber nicht woran es liegen könnte.
    Der Compiler gibt als Fehlermeldung immer nur das aus:
    In function main': Zeile:8 undefined reference toFeld::print_feld(char const*)

    Hier ma die codes:
    main:

    #include <iostream>
    #include "data.h"
    using namespace std;
    
    int main()
    {
        Feld feld1;
        feld1.print_feld( "blabla" );
    }
    

    data.h:

    #include <iostream>
    #ifndef _DATA_H_
    #define _DATA_H_
    using namespace std;
    
    class Feld
    {
        public:
        void print_feld ( const char* bla );
    };
    
    int print_feld ( const char* bla )
    {
        cout << bla;
    };
    
    #endif
    

    Danke schonmal im vor raus für hilfreiche Tipps.



  • void Feld::print_feld ( const char* bla )
    {
        cout << bla;
    };
    

    Fieser Fehler. 😉

    Du hast da keine Memberfunktion definiert, sondern eine freie Funktion. Dann hast du die Funktion auf das Objekt aufrufen wollen, der Linker konnte die aber nicht finden. Darum der Fehler.



  • Du definierst in der Header-Datei nur eine globale Funktion int print_feld(const char *bla) . Was du aber eigentlich definieren willst, ist die Methode der Klasse Feld (und zwar mit Rückgabetyp void , nicht int ). Ein weiterer Fehler ist, dass du die Methoder in der Header-Datei definierst und nicht nur deklarierst. In eine Header-Datei gehören nur die Deklarationen. Die Definitionen gehören in eine eigene .cpp-Datei, also müsste das ganze wie folgt aussehen:

    main.cpp:

    #include "data.h"
    using namespace std;
    
    int main()
    {
        Feld feld1;
        feld1.print_feld( "blabla" );
    }
    

    data.h (wieso nicht Feld.h? oder sind noch andere Klassen in der eigentlichen Datei?)

    #ifndef _DATA_H_
    #define _DATA_H_
    
    class Feld
    {
        public:
        void print_feld ( const char* bla );
    };
    
    #endif
    

    data.cpp (beziehungsweise Feld.cpp)

    #include "data.h"
    #include <iostream>
    
    using namespace std;
    
    void Feld::print_feld ( const char* bla )
    {
        cout << bla;
    };
    

    Eine weitere Sache ist, dass man niemals using namespace std; (oder auch andere Namespaces) in Hearder-Dateien benutzen sollte. Sonst wird in jeder Datei, in der man den Header benutzt der gesamte Namensraum std importiert, was den Zweck von Namensräumen aufhebt.

    Ich hoffe, dass hilft uns verwirrt nicht nur 😃 Sonst frag nochmal nach.

    Felix

    EDIT1: Courier für inline-Code
    EDIT2: Voraus wird mit einem r und zusammen geschrieben 💡



  • Jetzt funktionierts, danke.

    Heißt deshalb daten, weil ggf. noch mehr rein muss, weiß no ned genau

    Eigentlich ist eine externe .cpp datei doch angeblich nur übersichtlicher,
    finds aba so auch ok

    @ Phoemuex:
    versuch ma vor raus zusammen zu schreiben^^

    mfg Duck93



  • Duck93 schrieb:

    versuch ma vor raus zusammen zu schreiben^^

    Das Wort gibts ja auch nicht...



  • Duck93 schrieb:

    Heißt deshalb daten, weil ggf. noch mehr rein muss, weiß no ned genau

    Eigentlich ist eine externe .cpp datei doch angeblich nur übersichtlicher,
    finds aba so auch ok

    Nicht nur "angeblich". Wenn man für jede grössere Klasse eine eigenen eigenen Header und eine Implementierungsdatei hat, kann man neben der besseren Übersicht auch gezielt Dateien einbinden und Abhängigkeiten minimieren.

    Duck93 schrieb:

    @ Phoemuex:
    versuch ma vor raus zusammen zu schreiben^^

    Er sagte ja mit einem 'r'...


Anmelden zum Antworten