|
You last visited: Today at 08:44
Advertisement
C/C++ Übung mit Klassen
Discussion on C/C++ Übung mit Klassen within the C/C++ forum part of the Coders Den category.
11/25/2013, 19:59
|
#1
|
elite*gold: 260
Join Date: Jul 2009
Posts: 1,123
Received Thanks: 180
|
C/C++ Übung mit Klassen
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
|
#2
|
elite*gold: 1000
Join Date: Apr 2012
Posts: 1,003
Received Thanks: 208
|
Du musst &ch returnen und nicht ch.
|
|
|
11/25/2013, 20:37
|
#3
|
elite*gold: 420
Join Date: Jan 2012
Posts: 1,082
Received Thanks: 1,000
|
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
|
#4
|
elite*gold: 724
Join Date: Mar 2011
Posts: 10,479
Received Thanks: 3,318
|
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
|
#5
|
elite*gold: 420
Join Date: Jan 2012
Posts: 1,082
Received Thanks: 1,000
|
@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
|
#6
|
elite*gold: 724
Join Date: Mar 2011
Posts: 10,479
Received Thanks: 3,318
|
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
|
#7
|
elite*gold: 260
Join Date: Jul 2009
Posts: 1,123
Received Thanks: 180
|
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
|
#8
|
elite*gold: 297
Join Date: Dec 2010
Posts: 1,129
Received Thanks: 1,687
|
Quote:
Originally Posted by Peter File
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
|
#9
|
elite*gold: 260
Join Date: Jul 2009
Posts: 1,123
Received Thanks: 180
|
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
|
#10
|
elite*gold: 58
Join Date: Jun 2008
Posts: 2,311
Received Thanks: 8,420
|
Quote:
Originally Posted by snow911
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
|
#11
|
elite*gold: 260
Join Date: Jul 2009
Posts: 1,123
Received Thanks: 180
|
Quote:
Originally Posted by Padmak
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
|
#12
|
elite*gold: 58
Join Date: Jun 2008
Posts: 2,311
Received Thanks: 8,420
|
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
|
#13
|
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
|
Also Compiler würde ich mich auch weigern, sowas zu kompilieren.
|
|
|
12/04/2013, 05:30
|
#14
|
elite*gold: 260
Join Date: Jul 2009
Posts: 1,123
Received Thanks: 180
|
Quote:
Originally Posted by Schlüsselbein
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
|
#15
|
elite*gold: 58
Join Date: Jun 2008
Posts: 2,311
Received Thanks: 8,420
|
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
|
|
|
 |
|
Similar Threads
|
Signatur + PSD mit guter Übung
11/23/2012 - elite*gold Trading - 6 Replies
http://i2.minus.com/jAPpslvqUDHA5.png
|
Welche Klassen kann man mit den Klassen von WoW vergleichen?
10/09/2011 - General Gaming Discussion - 30 Replies
Thema sagt eigentl. alles ;)
|
[B] Kostenlose Signaturen l Übung
07/22/2011 - elite*gold Trading - 10 Replies
Hallo Leute,
ich würde gerne wieder etwas üben, darum habt ihr die Chance, dass ich kostenlose Signaturen erstelle.
Was ihr machen müsst ?
Das Ausfülllen :
|
Übung macht den Meister
01/31/2011 - Metin2 Private Server - 5 Replies
Hey Epvp
Da ich mir nun einen Root gekauft habe.Der
Soll Irgendwann ankommen.Habe ich mir überleg.
Das ich nicht beim installieren irgendwas falsch machen möchte.
Deswegen Meine Frage:
Gibt es irgendeine Art die Installation auf meinem Pc "Vorzuüben"?
MFG
XtReMe.
|
Kleines Tool zur Übung
12/31/2010 - AutoIt - 3 Replies
Ich hab mal ein bischen mit _Imagesearch rumgespielt
und rausgekommen ist ein kleines Tool für das Browsergame
Die-Staemme
Was macht es?
Es erscheint eine Gui in der versch. Buttons sind mit den jeweiligen Gebäuden(nicht alle....)
Wenn man auf die Buttons von Gebäude klickt wird nach den Gebäuden auf dem Bildschirm gesucht und raufgeklickt.
Bei Symbolen sind die Symbole im Hauptgebäude gemeint..
also wenn man z.b. auf das Symbol Holzfäller klickt wird nach diesem Symbol gesucht und...
|
All times are GMT +1. The time now is 08:45.
|
|