C/C++ Übung mit Klassen

11/25/2013 19:59 theo1990#1
Hallo Leute,

also ich hab das Problem, dass ich andauernd folgendender Fehler bekomme und ich kann mir nicht erklären wieso:
Code:
||=== login, Debug ===|
obj\Debug\main.o||In function `main':|
C:\PFADUNDSO\CODEblock\login\login\main.cpp|33|undefined reference to `Login::GetName()'|
||=== Build finished: 1 errors, 0 warnings (0 minutes, 2 seconds) ===|
so hier einmal der CODE dazu:

Code:
#######
main.cpp#
#######

#include <cstdlib>
#include <iostream>
#include <cstdio>
#include "login.h"

using namespace std;

struct userdata
{
  char name[20];
  char passwort[129];
};

int main()
{
  userdata benutzer;
  //char *name, *passwort;

    Login *auth = new Login();


    cout << "Bitte geben Sie ihren Benutzernamen ein!" << endl;
    scanf("%s",benutzer.name);

    cout << "Bitte geben Sie ihr Passwort ein!" << endl;
    scanf("%s",benutzer.passwort);

    cout << "Adresse von struct:" << &benutzer << endl;;

   // auth->SetName(&benutzer);
    //auth->SetPasswort(&benutzer);

    cout << auth->GetName();



    system("PAUSE");
    return EXIT_SUCCESS;
}
Code:
########
login.cpp##
########

#include "login.h"
#include <cstdlib>
#include <iostream>


using namespace std;

bool Login::UserLogin(char &username, char &passwort)
{

}

void Login::SetName(struct userdata *usr)
{
  cout << usr->name;
}
void Login::SetPasswort(struct userdata *usr)
{
  printf("%s", usr.passwort);
}

char* Login::GetName()
{
   // char *name;
    //name = &Login->name;
    //return name;
    char *name;
    char ch = 'a';
    name = &ch;
    return ch;
}
Code:
######
login.h##
######

class Login
{
  private:
    char name[20];
    char passwort[129];

   public:
     bool UserLogin(char &name, char &passwort);
     void SetName(struct userdata *usr);
     void SetPasswort(struct userdata *usr);
     char* GetName(void);
     char* GetPasswort(void);

};
so das sind meine 3 Dateien die ich mir geschrieben habe. Leider erkennt er anscheinend meine Klasse die ich oben initalisiert habe nicht an bzw. er sagt ja das die Referenz zu Login::GetName(void) undiefieniert ist aber wieso?? Ich ralls einfach nciht. Ich hab in 2 BÜchern die Kapitel über Pointer durchgelesen aber ich kommt nicht drauf. Auch habe ich mir wieder das Kapitel über OOP und Klassen durchgelesen und einiges rumprobiert aber solangsam bin ich am Ende :-P . Vllt fällt euch direkt auf was ich falsch gemacht habe.

Ich benutze CODEblocks und compiliere mit dem gcc compiler!
11/25/2013 20:13 qkuh#2
Du musst &ch returnen und nicht ch.
11/25/2013 20:37 +Yazzn#3
Ich glaube du bringst da etwas durcheinander:
char = Ein Zeichen
Beispiel: char some_char = 'f';

char * = Zeichenkette (Pointer auf das erste Zeichen; Das Ende der Kette wird durch das Nullzeichen '\0' gekennzeichnet)
Beispiel: const char *some_string = "foobar"; // wird gespeichert als 'f', 'o', 'o', 'b', 'a', 'r', '\0'

Außerdem: Wenn du Speicher mit new allokierst, dann musst du diesen mit delete wieder Freigeben (Zu dem Zweck schau dir mal RAII an, wobei du hier gar nicht mit Pointern und dynamischem Speicher arbeiten, sondern ganz einfach ein Objekt von Login erstellen solltest: Login auth;)
11/25/2013 20:45 snow#4
Wobei ch beim Return zerstört wird (bzw. nach dem Return, wie auch immer), somit dürfte der Zeiger auf irgendwas undefiniertes zeigen.

Bei mir kompiliert der Code übrigens. Ich würde auf irgendeinen Fehler beim Linken tippen.
11/25/2013 20:55 +Yazzn#5
@snow911 Das darf so normalerweise gar nicht kompilieren.

Unter Visual C++ Compiler Nov 2013 CTP (CTP_Nov2013):
return ch; - error C2440: 'return' : cannot convert from 'char' to 'char *'
11/25/2013 21:11 snow#6
Ups, hab natürlich &ch returnen lassen. Wobei clang da "Address of stack memory associated with local variable 'c' returned" ausgibt.
11/26/2013 07:15 theo1990#7
ich sehe gerade ich idiot initalisiere einen zeiger name und benutze diesen nicht xD....
in diesem fall könnte ich name returenen oder etwa nicht?

Mein Problem mit der ganzen Sache ist wir springen im unterricht immer zwischen C und C++. Speicher wird in C mit malloc(sizeof(...)); alokiert und wird mit free() freigegeben. In C++ ist es mit new und die fregabe ist mit delete(); . Klar die sache mit den Pointer und den referencen sind bei beiden gleich, jedoch komme ich garnicht mit C/C++ auf der Arbeit in Berührung. Also ihr meint jetzt im Konkretenfall hier geht es um die variable die ich zurückgebe und nicht dass der compiler die login.h nicht findet/kennt/meidet/ignoriert ?
11/26/2013 14:46 Raz9r#8
Quote:
Originally Posted by Peter File View Post
Beispiel: char *some_string = "foobar";
Könnte man auch als char some_string[] = { 'f', 'o', 'o', 'b', 'a', 'r', '\0' }; schreiben.
Nein, das stimmt so nicht. Das erste ist ungültig und sollte nicht kompilieren. String-Literals sind readonly und vom Typ const char *. Das benutzen von char[] erzeugt eine Kopie auf dem Stack, die dann auch schreibbar ist, aber nur im jeweiligen Gültigkeitsbereich erreichbar ist. Tatsächlich kann man auch Werte vom Typ char * zurückgeben, aber dann sollte man eigentlich eher std::string benutzen.
12/03/2013 17:36 theo1990#9
Hallo erstmal Danke für eure Antworten jedoch komme ich immer noch kein stück weiter hier nun meine Dateien:

Code:
//main.cpp
#include <cstdlib>
#include <iostream>
#include <cstdio>
#include "login.h"

using namespace std;

int main()
{
  char name[21], passwort[130];

    Login *auth = new Login();


    cout << "Bitte geben Sie ihren Benutzernamen ein!" << endl;
    scanf("%s",name);

    cout << "Bitte geben Sie ihr Passwort ein!" << endl;
    scanf("%s",passwort);


    auth->SetName(name);
    auth->SetPasswort(passwort);


    cout << "Der Login wurde gesetzt" << endl;

    system("PAUSE");
    return EXIT_SUCCESS;
}
Code:
//login.cpp
#include "login.h"
#include <cstdlib>
#include <iostream>


using namespace std;

bool Login::UserLogin(char &username, char &passwort)
{

}

void Login::SetName(char NewName[])
{
    Login->name = &NewName;
}

void Login::SetPasswort(char NewPasswort[])
{
    Login->passwort = &NewPasswort;
}

char* Login::GetName()
{
   // char *name;
    //name = &Login->name;
    //return name;
    char *name;
    char ch = 'a';
    name = &ch;
    return name;
}
Code:
//login.h

class Login
{
  private:
    char name[21];
    char passwort[130];

   public:
     bool UserLogin(char &name, char &passwort);
     void SetName(char NewName[]);
     void SetPasswort(char NewPasswort[]);
     char* GetName(void);
     char* GetPasswort(void);

};
Nun ist es so, dass mir diese Fehlermeldung um die Ohren geschmissen:

Code:
obj\Debug\main.o||In function `main':|
PFAD\main.cpp|22|undefined reference to `Login::SetName(char*)'|
PFAD/main.cpp|23|undefined reference to `Login::SetPasswort(char*)'|
||=== Build finished: 2 errors, 0 warnings (0 minutes, 1 seconds) ===|
und ich weiß immer noch nicht wieso ich undefined reference bekomme. Meint der Compiler mein char array das ich in die Funktion übergebe? Oder was ist mit referenz genau gemeint? (warscheinlich klönnt ihr mir das jetzt auh nicht sagen) Vielleicht könnte jemand kurz von euch drüberschauen ich verzweifele gleich.
12/03/2013 17:53 Padmak#10
Quote:
Originally Posted by snow911 View Post
Bei mir kompiliert der Code übrigens. Ich würde auf irgendeinen Fehler beim Linken tippen.
Du hast auch sicher deine login.cpp mitcompiled und vor allem auch mitgelinkt?

Padmak
12/03/2013 17:59 theo1990#11
Quote:
Originally Posted by Padmak View Post
Du hast auch sicher deine login.cpp mitcompiled und vor allem auch mitgelinkt?

Padmak
da bin ich mir eben nicht sicher. Kannste dir kurz mal die inculdes anschauen ?

Wie müsste ich denn das richtig linken?
12/03/2013 23:03 Padmak#12
Das steht nicht in den Includes, das muss in der Projektdatei stehen. Du könntest sie mal hochladen? (Wenn du immer noch C::B benutzt, die cbp-Datei)

Padmak
12/03/2013 23:07 Schlüsselbein#13
Also Compiler würde ich mich auch weigern, sowas zu kompilieren.
12/04/2013 05:30 theo1990#14
Quote:
Originally Posted by Schlüsselbein View Post
Also Compiler würde ich mich auch weigern, sowas zu kompilieren.
tut mir leid dasss ich noch keinen guten Programmierstil habe, jedoch finde ich dein Kommentar an dieser Stelle mehr als unpassend und destruktiv! Ich dachte in dieser Sektion wäre die Aroganz und die Überheblichkeit geringer als in anderen Sektions aber anscheinend ist das heutzutage ein generelles Problem.

@Padmak:
Ja ich benutze noch Code::blocks und sie befindet sich in meinem Projekt jedoch habe ich jetzt die Methoden der Klasse in die Main.ccp getan und siehe da die Fehlermeldung war weg. Nun interessiert mich natürlich brennend wieso der Linker das nicht geregelt hat.
12/04/2013 09:49 Padmak#15
Du kannst trotzdem einfach mal die cbp hier hochladen (oder von mir aus auch mir per PN schicken), solange wir nicht wissen was falsch ist kann dir keiner sagen wieso es nicht funktioniert^^

Padmak