Fragen zum Klassenbsp
-
Hallo, danke für die schnelle antwort.
zwutz schrieb:
Außerdem hat deine Klasse Zeit diesen Operator für sich überladen, damit man auch sowas machen kann:
Zeit a( 10, 15 ); Zeit b( 3, 50 ); a += b; // a ist jetzt Zeit( 14, 5 )Zeit Zeit::operator+=(Zeit a) //Zeile 1 { m_stunde += a.getStunden(); // Zeile 2 m_minute += a.getMinuten(); // Zeile 3Ich muss ehrlich sagen, zeile 1 verstehe ich überhaupt nicht.
Ich kann mir nichts darunter vorstellen. zeit is ja die klasse, aber den rest ...
könntst es vielleicht genauer erklären, wenn möglich? dankemfg
-
Du musst einfach nur wissen, dass Operatoren im Grunde auch nichts anderes als Funktionen sind. In dem Fall gehts sozusagen um die Funktion 'operator+='. Dann dürfte der Rest eigentlich klar sein, oder?
-
soll es etwa heissen:
Zeit Zeit::operator+=(Zeit a) ====> Zeit= Zeit+ Zeit a?
-
_matze schrieb:
/edit pumuckl: [cpp]-Tags dazu. nächstemal bitte selber machen!
Nächstes Mal bitte richtig machen!

Done

@N5803: schau dir im Buch/Tutorial deiner Wahl einfach mal an was der operator+= für die eingebauten Datentypen macht. Das Verhalten dürfte (bzw. sollte) hier ähnlich sein.
Dann sollte im gleichen Buch/Tutorial stehen wie man Operatoren überlädt.
Im Magazin gibts zu dem Thema auch einen Artikel.
-
ok danke nochmal. ich werd mal schnell die liste durchlesen.
lg
-
sry, vergessen f5 zu drücken : D
-
N5803 schrieb:
soll es etwa heissen:
Zeit Zeit::operator+=(Zeit a) ====> Zeit= Zeit+ Zeit a?
genau
die Operatoren sind nur Funktionen, nichts anderes.
hast du also wie in meinem Beispiel zwei Zeit-Objekte a und b und führst folgende Operation aus:
a += b;ist das für den Compiler das gleiche, als würdest du das schreiben:
a.operator+=(b)damit dürfte die Sache klarer werden
nochmal an Zeile 1:
Zeit Zeit::operator+=(Zeit a)eigentlich sollte sie so aussehen:
Zeit& Zeit::operator+=(const Zeit& a)es geht zwar beides, aber letzteres erspart ein wenig Zeit, da die Objekte nicht kopiert werden müssen.
Die Funktion liefert eine Referenz auf ein Zeit-Objekt zurück. Üblicherweise wird dazu
return *this;verwendet (wie in deinem Beispiel auch). Also das aufgerufene Objekt gibt sich selbst zurück.
Damit ist dann auch sowas möglich:Zeit a,b,c; a += b += c;ausführlich also das gleich wie das:
b = b + c; a = a + b;ansonsten siehe Rotschopf, äh, Pumuckl
-
alles klar
danke für die genaue erklärung. Ich habe sowieso aus der einen Liste nichts anderes rauslesen können 
glg

-
moin moin, hoffe da kann jmd helfen: also ich habe hier ein eigenes klassen-bsp nur bekomme ich immer wieder diese fehlermeldung:
[Linker error] undefined reference to `Rational::Rational()'Hier ist der Code, wäre sehr dankbar für jede Hilfe.
#include <cstdlib> #include <iostream> class Rational { int m_zaehler; int m_nenner; void kuerzen(float); public: int getZaehler(); int getNenner(); void setZaehler(int); void setNenner(int); Rational(); Rational operator+(Rational); Rational operator-(Rational); Rational operator*(Rational); Rational operator/(Rational); void print(); }; void Rational::setZaehler(int z) { m_zaehler=z; } void Rational::setNenner(int n) { m_nenner=n; } int Rational::getNenner() { return m_nenner; } int Rational::getZaehler() { return m_zaehler; } //HIER KÜRZEN FUNKTION Rational Rational::operator+(Rational p) { Rational tmp; tmp.setNenner(m_nenner * p.getZaehler() + m_zaehler * p.getNenner()); tmp.setZaehler(m_nenner * p.getNenner()); return tmp; } Rational Rational::operator-(Rational p) { Rational tmp; tmp.setZaehler(m_nenner * p.getZaehler() - m_zaehler * p.getNenner()); tmp.setNenner(m_nenner * p.getNenner()); return tmp; } Rational Rational::operator*(Rational p) { Rational tmp; tmp.setZaehler(m_zaehler * p.getZaehler()); tmp.setNenner(m_nenner * p.getNenner()); return tmp; } Rational Rational::operator/(Rational p) { Rational tmp; if(p.getNenner()==0) { printf("Nur Chuck Norris kann durch 0 dividieren \n"); //cout<<"Nur Chuck Norris kann durch 0 dividieren \n"<<endl; return *this; } else { tmp.setZaehler(m_nenner * p.getZaehler()); tmp.setNenner(m_zaehler * p.getNenner()); return tmp; } } void Rational::print() { if(m_nenner != 1) { printf("%d \n",m_zaehler); //cout<<" \n"<<m_zaehler; printf("--\n"); //cout<<"--\n"<<endl; //cout<<" \n"<<m_nenner; printf("%d \n", m_nenner); } else { printf("%d \n",m_zaehler); // cout<<" \n"<<m_zaehler; } } using namespace std; int main(int argc, char *argv[]) { Rational r1, r2, r3, r4; //Rational erg1, erg2, erg3, erg4; r1.setZaehler(3); r1.setNenner(4); r2.setZaehler(2); r2.setNenner(8); r3.setZaehler(1); r3.setNenner(2); r4.setZaehler(7); r4.setNenner(1); r1.print(); r2.print(); r3.print(); r4.print(); system("PAUSE"); return EXIT_SUCCESS; }mfg
-
Lösche mal Zeile 25. Da deklarierst du einen Konstruktor, den du gar nicht definierst.
-
es funzt
Danke!!!Eine Frage: Wann brauch ich einen Constructor und wann nicht und wie kann ich (in meinem bsp z.b.) den constructor anwenden.
lg
-
Man definiert einen eigenen Konstruktor, wenn man Variablen initialisieren will und vielleicht dem Erzeuger der Klasseninstanz die Möglichkeit geben will, zu diesem Zweck Parameter zu übergeben. Du solltest dir am besten mal ein C++-Anfänger-Tutorial reinziehen, da werden solche Dinge detailliert erläutert.

-
hallöle, hab in 10 min info prüfung. könnte mir jmd vielleicht etwas behilflich sein? wäre echt super danke.

-
N5803 schrieb:
hallöle, hab in 10 min info prüfung. könnte mir jmd vielleicht etwas behilflich sein? wäre echt super danke.

Ich drück dir die Daumen

Viel mehr kann man da nicht helfen
-
pumuckl schrieb:
N5803 schrieb:
hallöle, hab in 10 min info prüfung. könnte mir jmd vielleicht etwas behilflich sein? wäre echt super danke.

Ich drück dir die Daumen

Viel mehr kann man da nicht helfen
hmmmm
vielleicht etwas fachliche hilfe noch dazu? 
-
N5803 schrieb:
pumuckl schrieb:
Viel mehr kann man da nicht helfen

hmmmm
vielleicht etwas fachliche hilfe noch dazu? 
Das Forum soll dir beim Lernen helfen, nicht beim Bescheißen. Wir machen keine Hausaufgaben, es gibt keine Komplettlösungen - und Klausurhilfe daher schonmal garnicht.