Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

ProAmateur

Alter Hase

  • »ProAmateur« ist der Autor dieses Themas

Beiträge: 434

Wohnort: Bei Simmern, Koblenz

Beruf: Schüler

  • Private Nachricht senden

1

13.03.2012, 15:25

Überladene Operatoren

Hi

bin grad dran eine Klasse für große Zahlen mit theoretisch bis zu unendlich vielen Stellen zu schreiben und hab ein Problem mit dem Überladen von Operatoren.
Ich hab den Text:

C-/C++-Quelltext

1
2
vector<int> operator+       (BigNumber BNSumand); 
void operator+=     (BigNumber BNSumand)    {vDaten = (this /*hier ist der fehler*/ + BNSumand)->GetvDaten();}; 


So, der Compiler zeigt jetzt an, dass kein Operator mit den Operanden übereinstimmt?!?!?!
Aber wieso?
Sind doch vom selbnen typ der Operand von+ und der in der operator+= Funktion.

voallem, weil es mit integervariablen funktioniert, dabei sagt er gar nix:

C-/C++-Quelltext

1
2
vector<int> operator+       (int iSumand);
void operator+=     (int iSumand)           {vDaten = (this + iSumand)->GetvDaten();};


Habt ihr ne Idee, woran das liegt?

ProAmateur
"Die Neugier steht immer an erster Stelle eines Problems, das gelöst werden will."
Galileo Galilei
________________________________________________________________________

"Dumme Fragen gibt es nicht, dumm ist nur, wer nicht fragt.“

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

13.03.2012, 15:36

Wieso returned dein operator + einen vector<int>?
operator + sollte wohl const sein.
operator += sollte wohl eine const BigNumber& als Parameter nehmen.
operator += sollte wohl eine BigNumber& returnen (*this).
this ist ein Pointer, daher macht this + BNSumand wohl kaum Sinn.
vector<int> hat keine Methode getvDaten.

ProAmateur

Alter Hase

  • »ProAmateur« ist der Autor dieses Themas

Beiträge: 434

Wohnort: Bei Simmern, Koblenz

Beruf: Schüler

  • Private Nachricht senden

3

13.03.2012, 17:34

zu 1: ich hab gedacht, wenn ich z.B. für irgendeine rechnung eine sehr große zahl plus 50 rechnen muss mach ich das so (die Klasse hat innen einen vector für jede ziffer, so kann die zahl unedlich groß werden):

BigNumber += 50;

so darin soll ja dann auf die daten von der großen nummer 50 addiert werden:

vDaten = BigNumber + 50

Und das mach ich ja durch den operator meiner klasse in dem ich halt die vDaten aus der BigNumber auslese und diese dann durch einen algorithmus plus 50 rechne und da muss ja dann wieder ein vector zurückgegeben werden, sonst kann ich ja nicht die zuweißung in der += machen.

zu 2/3.
Wieso müssen diese const sein?

zu 4: Was meinst du damit?

zum rest: versteh ich, stell das aber erst mal zurück.
"Die Neugier steht immer an erster Stelle eines Problems, das gelöst werden will."
Galileo Galilei
________________________________________________________________________

"Dumme Fragen gibt es nicht, dumm ist nur, wer nicht fragt.“

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

14.03.2012, 00:44

zu 1: ich hab gedacht, wenn ich z.B. für irgendeine rechnung eine sehr große zahl plus 50 rechnen muss mach ich das so (die Klasse hat innen einen vector für jede ziffer, so kann die zahl unedlich groß werden):

BigNumber += 50;

so darin soll ja dann auf die daten von der großen nummer 50 addiert werden:

vDaten = BigNumber + 50

Und das mach ich ja durch den operator meiner klasse in dem ich halt die vDaten aus der BigNumber auslese und diese dann durch einen algorithmus plus 50 rechne und da muss ja dann wieder ein vector zurückgegeben werden, sonst kann ich ja nicht die zuweißung in der += machen.

Schön und gut. Aber das erklärt nicht warum das Ergebnis von big_number + 50 ein vector<int> sein sollte und keine BigNumber!?

zu 2/3.
Wieso müssen diese const sein?

Müssen nicht, der operator + sollte aber const sein!? Oder gibt es einen bestimmten Grund wieso er nicht const sein sollte?

zu 4: Was meinst du damit?

Deine Operatoren sollten wohl so in der Art aussehen (unter der Annahme dass du sie als Memberfunktionen implementierst):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
const BigNumber operator +(BigNumber b) const
{
  return b += *this;
}

BigNumber& operator +=(const BigNumber&)
{
  // implementierung der addition hier
  return *this;
}


Wobei es noch besser wäre, operator + als freie Funktion zu implementieren:

C-/C++-Quelltext

1
2
3
4
const BigNumber operator +(BigNumber a, const BigNumber& b)
{
  return a += b;
}


zum rest: versteh ich, stell das aber erst mal zurück.

Was genau meinst du damit? Der "Rest" bezieht sich auf diesen Code:

C-/C++-Quelltext

1
void operator+=     (int iSumand)           {vDaten = (this + iSumand)->GetvDaten();};

Ich seh nicht wo man da etwas "zurückstellen" könnte. Der Code ist schlicht und einfach falsch.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (14.03.2012, 00:54)


Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

5

14.03.2012, 09:16

this ist nen BigNumber*, keine BigNumber.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Werbeanzeige