Operator überladen
-
Erstens: Das einfache Gleichheitszeichen ist bereits als "Zuweisung" definiert, das solltest du besser nicht für andere Zwecke verwenden. Für Vergleiche nimmt man in C(++) das doppelte Gleichietszeichen ==.
Zweitens: Operatoren überladen ist eigentlich recht einfach:
class adress { string vorname,nachname,...; ... public: bool operator==(const adress& other) const { return vorname==other.vorname && nachname==other.nachname && ...; } }; //oder class adress { string vorname,nachname,...; public: string get_vorname() const {return vorname;} string get_nachname() const {return nachname;} ... }; bool operator==(const adress&l,const adress&r) { return l.get_vorname()==r.get_vorname() && l.get_nachname()==r.get_nachname() && ... }(im zweiten Fall könntest du dem Operator auch friend-Zugriff gewähren und dann direkt auf die Member zugreifen)
Edit @Shinja: Dein Code klappt nicht so, bei der Operator-Überladung muß mindestens ein eigener Typ beteiligt sein.
-
Echt? Wusste ich gar nicht.
Aber der TE hat ja von char arrays gesprochen. In dem Fall könnte er es ja gar nicht überladen oder wie?
EDIT: das obige ist Blödsinn, sorry. Hatte nicht ganz richtig gelesen.
Aber sehr gut zu wissen, dass man operator überladung nur für eigene Typen machen kann.
-
danke für eure antworten. ich kriegs aber nicht hin
wenn ich deine erste lösung nehme, wie vergleiche ich? also wie rufe ich den überladenen operator auf und was erhalte ich als rückgabewert?
cppnaggi
-
cppnaggi schrieb:
wenn ich deine erste lösung nehme, wie vergleiche ich? also wie rufe ich den überladenen operator auf und was erhalte ich als rückgabewert?
Der Aufruf funktioniert ganz "normal":
adress a1,a2; ... if(a1==a2) mach_was(); //oder vector<adress> Adressbuch; adress sucher; ... vector<adress>::iterator such_pos=find(Adressbuch.begin(),Adressbuch.end(),sucher);(Anmerkung: Das funktioniert unabhängig davon, welcher der obigen Varianten du verwendet hast)
-
Hallo
Als Rückgabewert erhälst du das definierte, also ein bool (true, false) Je nachdem, ob es gleich ist oder nicht.
chrische
-
ich habe versucht zu verstehen, was du meinst. ich versteh das nicht. vergleicht diese funktion tatsächlich nur zwei simple chararrays miteinander oder 2 elemente der klasse adress?
Ich will NUR zwei chararrays vergleichen und soll dazu den == Operator überladen. Ich habe eine funktion, die mir sagt, ob 2 chararrays gleich sind oder nicht. Dieser Funktion übergebe ich diese zwei.
int i=strcompare(txt1,txt2);
if(i==1)
{
//do this
}kannst du verstehen was ich meine? Ich habe zwar schon eine Klasse Address, aber ich kriegs nicht hin.
-
cppnaggi schrieb:
ich habe versucht zu verstehen, was du meinst. ich versteh das nicht. vergleicht diese funktion tatsächlich nur zwei simple chararrays miteinander oder 2 elemente der klasse adress?
Der vergleicht zwei Objekte der Klasse adress miteinander.
Ich will NUR zwei chararrays vergleichen und soll dazu den == Operator überladen. Ich habe eine funktion, die mir sagt, ob 2 chararrays gleich sind oder nicht. Dieser Funktion übergebe ich diese zwei.
int i=strcompare(txt1,txt2);
if(i==1)
{
//do this
}kannst du verstehen was ich meine? Ich habe zwar schon eine Klasse Address, aber ich kriegs nicht hin.
Einen op==, der zwei char-Arrays bekommt, darfst du nicht anlegen, weil bei eigenen Operatoren mindestens ein eigener Datentyp beteiligt sein muß (und einen Vergleich für char-Arrays gibt es bereits in C++ - der vergleicht die Adressen, an denen sie im Speicher liegen).
Ansonsten: Wenn du diese Funktion "strcompare()" hast, kannst du sie auch so nutzen wie du angedeutet hast. Wenn du sie selber schreiben sollst, wirf mal einen Blick auf man: strcmp.
(oder noch besser: Vergiss die char-Arrays und arbeite mit std::string)
-
ich meine woher weiß die neue boolsche funktion bool operator==... was sie vergleichen soll? ich meine nach welchen kriterien wird was verglichen?
return vorname==other.vorname && nachname==other.nachname && ...;das gibt doch was zurück und vergleicht nichts?!
-
cppnaggi schrieb:
ich meine woher weiß die neue boolsche funktion bool operator==... was sie vergleichen soll? ich meine nach welchen kriterien wird was verglichen?
return vorname==other.vorname && nachname==other.nachname && ...;das gibt doch was zurück und vergleicht nichts?!
Jaa, sie gibt true oder false zurück. Also wahr oder falsch.
Nach dem Motto:
Ist diese Adresse/dieser String gleich: Ja(true) oder Nein(false).Gruß
Don06
-
Die Funktion gibt das Ergebnis des Ausdrucks "vorname==other.vorname && nachname==other.nachname && ..." zurück - und darin vergleichst du this->vorname mit other.vorname, this->nachname mit other.nachname etc und kombinierst alle diese Vergleichsergebnisse per logischem UND. Das heißt, wenn alle diese Vergleiche 'true' geliefert haben, gibst du selber 'true' zurück, wenn ein Vergleich 'false' liefert gibst du 'false' zurück.
(und der Vergleichsoperator für string ist verwendet wiederum strcmp(), um die Inhalte der beiden Strings zu vergleichen)
-
so wie es aussieht bin ich total behämmert.
meine funktion ursprünglich:
void search_address(Address* list) { int ik=0; char txt[15]; char test[15]; cout << "Bitte den gesuchten Namen eingeben!" << endl; cin >> txt; Address* ad = list; if(ad==NULL) { cout << "Es kann nicht auf Gleichheit geprüft werden, da kein Datensatz vorhanden"; } else { while(ad!=NULL) { ik=strcompare2(txt,ad->getSurname()); if(ik==1) { cout << "Name gefunden!" << endl; } ad=ad->getNextAddress(); } if(ik!=1) { cout << "Adresse leider nicht gefunden!" << endl; } } }Wenn ne klammer falsch sitzt -> sorry. ich hoff ihr blickt da durch. wie kann ich diese funktion anpassen mit nem überladenem operator?
-
//Falscher Thread
-
Hallo zusammen!
Ich habe zwar auch noch so meine Probleme mit dem Überladen von Operatoren, möchte es aber mal versuchen. Vielleicht lerne ich ja so auch noch etwas

class adress { string vorname,nachname,...; ... public: bool operator==(const adress& other) const { return vorname==other.vorname && nachname==other.nachname && ...; } };int main() { adress Adressbuch[10]; // oder std::vector<adress> Adressbuch; adress adress; // Eine Instanz für die Eingabe des gesuchten Namens. cout << "Bitte geben Sie den gesuchten Namen ein." << endl; cout << "Vorname: "; cin >> adress.vorname; cout << "/nNachname: "; cin >> adress.nachname; // Eingabe mit Liste vergleichen for(int i = 0; i <= 9; ++i) // Einträg des Adreesbucharrays durchlaufen { if(Adressbuch[i] == adress) // Hier findet praktisch der Aufruf des { // Überladenen Operators== statt cout << "Eintrag gefunden" << endl; } } std::vector<adress>::iterator iter; // oder mit dem vector for(iter = Adressbuch.first(); iter != Adressbuch.end(); ++iter) { if(iter == adress) { cout << "Eintrag gefunden" << endl; } } return 0; }So, ich hoffe dass ich hier jetzt keine Fehler gemacht habe.
Den Vergleichsteil kannst du natürlich noch in einer Funktion auslagern.
Gruß Spartaner
-
danke für die antwort. ich habe das jetzt so implementiert.
compilieren geht ohne probleme. beim ausführen des programmteils bekomme ich:
segmentation fault (core dump)
?!
class Address { private: char surname[15]; char firstname[15]; char zip[15]; char city[15]; Address *NextAddress; public: . . . bool operator==(const Address& other) const { return surname==other.surname; } }; void search_address(Address* list) { Address adressbuch[10]; Address* address; char txt[15]; cout << "Bitte gesuchten Namen eintippen!" << endl; cin >> txt; address->setSurname(txt); Address* ad = list; while(ad!=NULL) { if(address->getSurname() == ad->getSurname()==true) { cout << "Eintrag gefunden" << endl; break; } else { ad=ad->getNextAddress(); } } /*int ik=0; char txt[15]; char test[15]; cout << "Bitte den gesuchten Nachnamen eintippen!" << endl; cin >> txt; cout << " Gelesen: " << txt << endl; Address* ad = list; if(ad==NULL) { cout << "Es kann nicht auf Gleichheit geprueft werden, da kein Datensatz vorhanden"; } else { while(ad!=NULL) { ik=strcompare2(txt,ad->getSurname()); if(ad->getSurname()==other->getSurname()) { cout << "Adresse wurde gefunden!" << endl; cout << " " << endl; cout << ad->getSurname() << endl; cout << ad->getFirstname() << endl; cout << ad->getZip() << endl; cout << ad->getCity() << endl; break; } ad=ad->getNextAddress(); } if(ik!=1) { cout << "Adresse wurde leider nicht gefunden!" << endl; } }*/ }
-
char-Arrays kannst du nicht per == auf Gleichheit prüfen (der entsprechende Operator vergleicht die Adressen der Arrays), dafür gibt es das oben erwähnte strcmp().
(und auch auf die Gefahr, mich zu wiederholen: Vergiss die char-Arrays und arbeite mit std::string)Außerdem kommt in deinem Beispiel dazu, daß der Zeiger "Adress* adress" ins Nirvana verweist (und der Dreifachvergleich in der if()-Abfrage ist auch sinnlos).
-
danke für eure Hilfe,
ich werd's jetzt lassen. ich kriegs halt nich wirklich hin.
trotzdem danke
-
na, nicht so schnell aufgeben. Wenn man mal was nicht versteht, dann muss man es sich halt öfters angucken und zur Not 3 oder 4 mal nachfragen.
Änder dein Programm doch erst mal soweit, dass du statt den char-arrays die std::string nutzt. Und dann gucke dir die hier genannten Beispiele nochmal Zeile für Zeile und versuche es umzusetzen.
Wenn du dir das in Ruhe nochmal anguckst, dann wirst du das auch schaffen.