Hilfe!undefined reference to `Person::setlastName(char*)



  • Helfen Sie mir bitte!
    Was ist nicht richtig in meinem Programm?
    Es gibt mir error messages 15|undefined reference to `Person::setlastName(char*)'|. Ich benutze CodeBlocks.

    #include <iostream>
    
    using namespace std;
    #include "person.h"
    //#include "person.cpp"
    
    int main(int argc, char *argv[])
    {
        Person p;
    
        p.setlastName("Smith");
        p.setfirstName("John");
        p.setmiddleInitial("M");
        p.setdateOfBirth("06.25.1989");
        p.setstreetAddress("205 Nicholas St.");
        p.setcity("Dallas");
        p.setstate("TX");
        p.setzipCode("52080");
        p.sethomePhone("755-258-5595");
        p.setworkPhone("755-358-1125");
    
    cout << p.getlastName()    << endl
         << p.getfirstName()   << endl
         << p.getmiddleInitial() << endl
         << p.getdateOfBirth() << endl
         << p.getstreetAddress() << endl
         << p.getcity()        << endl
         << p.getstate()        << endl
         << p.getzipCode()     << endl
         << p.gethomePhone()   << endl
         << p.getworkPhone()   << endl;
    
    return 0;
    }
    
    // Person.h
    
    #ifndef PERSON_H
    #define PERSON_H
    
    class Person{
    
        char lastName [21];
        char firstName [15];
        char middleInitial[3];
        char dateOfBirth[11];
        char streetAddress [25];
        char city [20];
        char state [3];
        char zipCode [11];
        char homePhone [13];
        char workPhone [13];
    
    public:
    
        void setlastName (char *L);
        char* getlastName();
    
        void setfirstName (char *F);
        char* getfirstName ();
    
        void setmiddleInitial (char *M);
        char* getmiddleInitial ();
    
        void setdateOfBirth (char *D);
        char* getdateOfBirth ();
    
        void setstreetAddress (char *A);
        char* getstreetAddress ();
    
        void setcity (char *C);
        char* getcity ();
    
        void setstate (char *S);
        char* getstate ();
    
        void setzipCode (char *Z);
        char* getzipCode ();
    
        void sethomePhone (char *H);
        char* gethomePhone ();
    
        void setworkPhone (char *W);
        char* getworkPhone ();
    
    };
    
    #endif
    
    //person.cpp:
    
    #include <string.h>
    #include "person.h"
    
    void Person::setlastName(char *L)
    {
    strcpy (lastName, L);
    }
    
    char* Person::getlastName()
    {
    static char temp[21];
    strcpy (temp, lastName);
    return temp;
    }
    
    void Person::setfirstName(char *F)
    {
    strcpy (firstName, F);
    }
    
    char* Person::getfirstName()
    {
    static char temp[15];
    strcpy (temp, firstName);
    return temp;
    }
    
    void Person::setmiddleInitial(char *M)
    {
    strcpy (middleInitial, M);
    }
    
    char* Person::getmiddleInitial()
    {
    static char temp[3];
    strcpy (temp, middleInitial);
    return temp;
    }
    
    void Person::setdateOfBirth(char *D)
    {
    strcpy (dateOfBirth, D);
    }
    
    char* Person::getdateOfBirth()
    {
    static char temp[11];
    strcpy (temp, dateOfBirth);
    return temp;
    }
    
    void Person::setstreetAddress(char *A)
    {
    strcpy (streetAddress, A);
    }
    
    char* Person::getstreetAddress()
    {
    static char temp[25];
    strcpy (temp, streetAddress);
    return temp;
    }
    
    void Person::setcity(char *C)
    {
    strcpy (city, C);
    }
    
    char* Person::getcity()
    {
    static char temp[20];
    strcpy (temp, city);
    return temp;
    }
    
    void Person::setstate(char *S)
    {
    strcpy (state, S);
    }
    
    char* Person::getstate()
    {
    static char temp[3];
    strcpy (temp, state);
    return temp;
    }
    
    void Person::setzipCode(char *Z)
    {
    strcpy (zipCode, Z);
    }
    
    char* Person::getzipCode()
    {
    static char temp[11];
    strcpy (temp, zipCode);
    return temp;
    }
    
    void Person::sethomePhone(char *H)
    {
    strcpy (homePhone, H);
    }
    
    char* Person::gethomePhone()
    {
    static char temp[13];
    strcpy (temp, homePhone);
    return temp;
    }
    
    void Person::setworkPhone(char *W)
    {
    strcpy (workPhone, W);
    }
    
    char* Person::getworkPhone()
    {
    static char temp[13];
    strcpy (temp, workPhone);
    return temp;
    }
    

  • Mod

    Kann ich nicht nachvollziehen. Ich vermute mal, dass du in deiner IDE die Dateien einfach nicht korrekt zu einem Projekt zusammen gebunden hast. Du solltest in dem Fall aber eine ganze Reihe von Fehlermeldungen bekommen, denn es sollte gar nichts aus der person.cpp gefunden werden. Falls du nicht genau weißt, wie du bei Code::Blocks Dateien zu einem Projekt zusammen fügst, dann solltest du im Handbuch/Google dazu fündig werden. Falls nicht, kann ich den Thread auch ins Compiler&IDE-Forum verschieben, da weiß sicher jemand Bescheid.

    Zu deinem Programm bin ich einerseits schwer begeistert, dass du die korrekten Datentypen für Postleitzahlen, Telefonnummern & Co. wählst (viele Anfänger würden da int oder ähnliches nehmen), aber andererseits behandelst du Zeichenketten, dass sich einem der Magen umdreht. C-Strings (also nullterminierte char-Arrays) haben in C++ eigentlich kaum etwas zu suchen und ganz bestimmt nicht in einem Kontext wie diesem hier. Derzeit ist dein Code nicht threadsicher. Selbst in seriellem Code muss man hier aufpassen, dass man sich nicht selber den Boden unter den Füßen weg schießt. Mir ist auch gar nicht die Absicht dahinter klar. Willst du verhindern, dass jemand über die get-Funktionen den Wert der Felder ändern kann? Dann gib const char* zurück! Dann entfällt das ganze Geschwurbel mit dem static und strcpy. Überhaupt mangelt es an const-correctness: Die set-Funktionen sollten nämlich ebenfalls const char* benutzen, da sie ihr Argument nicht verändern (sie kopieren ja bloß). Die Konvertierung char* -> const char* , die in deinem Programm derzeit nötig ist, ist in C++ zwar aus historischen Gründen noch möglich, aber korrekt ist das ja eigentlich nicht. Es ist sogar offiziell "deprecated", es kann also sein, dass dies in Zukunft nicht mehr möglich ist.

    All diese Problematiken (und noch ein paar mehr, die ich nicht genannt habe) würde sich ganz von alleine lösen, würdest du std::string benutzen anstatt C-Strings.

    PS: Natürlich ist die Nutzung von const char* als Rückgabewert nicht narrensicher, eben weil die (an sich unsinnige) Konvertierung const char* zu char* erlaubt ist. Aber wer diese Konvertierung nutzt und tatsächlich darüber Änderungen vornimmt, ist selber schuld, wenn ihm das Programm um die Ohren fliegt. Auch dies ist ein Problem, dass sich mit std::string ganz von alleine löst, denn die Konvertierung const std::string& zu std::string& ist nicht erlaubt!



  • Vielen Dank, SeppJ!

    Kannst du den Thread ins Compiler&IDE-Forum verschieben? Ich brauche die Aufloesung!

    Und noch - Ich habe versucht nach Klassen, Class oder Person auf dem Forum zu suchen - und es hat nicht funktioniert. 😞

    Nochmals vielen Dank!



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (alle ISO-Standards) in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    elenaq13 schrieb:

    Und noch - Ich habe versucht nach Klassen, Class oder Person auf dem Forum zu suchen - und es hat nicht funktioniert. 😞

    Ja, die Forensuche ist derzeit leider defekt. Ich empfehle eine Suche powered by Google: Google: Suchbegriffe site:www.c-plusplus.net
    Aber "Klasse" und "Class" sind viel zu allgemein. Dieses Forum ist kein Lehrbuch, was eine Klasse ist. In fast 100% der Threads kommen Klassen vor und bei den meisten wird voraus gesetzt, dass man weiß, was das ist.
    "Person" ist hingegen wieder zu speziell. Das ist ja nur deine spezielle Aufgabenstellung, dass es um Personendaten geht, dein Problem wäre ja auch aufgetreten, wenn es um Busfahrpläne oder Hühnereier ginge.



  • SeppJ - Sie haben mir eine gute Idee gegeben - ich habe ein neues Program gemacht - einfach kopierte das alte aufs neu - und es funktioniert! Sie haben recht gehabt es war the Compiler.
    Vielen Dank!


Log in to reply