Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: Die Artikel ::  Überladung von Operatoren in C++ (Teil 1)  
Gehen Sie zu Seite Zurück  1, 2
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
pumuckl
Moderator

Benutzerprofil
Anmeldungsdatum: 21.06.2005
Beiträge: 7326
Beitrag pumuckl Moderator 15:41:07 21.01.2009   Titel:              Zitieren

hab dort geantwortet.

_________________
Du brauchst Hilfe? - Forenregeln. Den richtigen Code posten - machs uns einfacher dir zu helfen
Don't feed the Help Vampires!
pospiech
Mitglied

Benutzerprofil
Anmeldungsdatum: 04.11.2006
Beiträge: 595
Beitrag pospiech Mitglied 15:09:02 12.02.2009   Titel:              Zitieren

Ich würde das hier mit const schreiben, also statt
C++:
X operator+(X const& lhs, X const& rhs)

das hier
C++:
const X operator+(X const& lhs, X const& rhs)


Dann kann man nicht "(a+b)=c" schreiben.
icarus2
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.09.2009
Beiträge: 1366
Beitrag icarus2 Mitglied 23:35:23 06.05.2011   Titel:              Zitieren

*Edit
Sry, habe etwas in den falschen Thread kopiert.


Zuletzt bearbeitet von icarus2 am 23:36:23 06.05.2011, insgesamt 1-mal bearbeitet
nuke1600
Unregistrierter




Beitrag nuke1600 Unregistrierter 14:36:56 08.06.2012   Titel:   Tip Top            Zitieren

Sehr guter Artikel.

Solltest du gewillt sein, an der ein oder anderen Stelle etwas ausführlicher zu werden, würde ich mich sehr darüber freuen.

Mir ist allerdings etwas aus deinem Beispiel aufgefallen. Folgender Code dürfte nicht ganz richtig sein, schließlich hast du extra den Konstruktor programmiert, verwendest ihn aber nicht. Bei der Erzeugung von a, b und c solltest du noch Standardwerte nachreichen, ansonsten kommt bei der Addition nur Mumpitz raus.

Code:
1
2
3
4
5
6
7
8
9
10
11
12
class Rational
{
public:
  Rational(int i); //Konstruktor für Konvertierungen von Ganzzahlen
  Rational operator+(Rational const& rhs) const;
};
 
Rational a, b, c;
int i;
a = b + c; //ok, keine Konvertierung nötig
a = b + i; //ok, implizite Konvertierung des zweiten Arguments
a = i + c; //FEHLER: erstes Argument kann nicht konvertiert werden, da operator+ keine freie Funktion
Nexus
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.05.2006
Beiträge: 10328
Beitrag Nexus Mitglied 17:32:45 09.06.2012   Titel:   Re: Tip Top            Zitieren

nuke1600 schrieb:
schließlich hast du extra den Konstruktor programmiert, verwendest ihn aber nicht.
Doch, er wird für die implizite Konvertierung von int nach Rational verwendet.

nuke1600 schrieb:
Bei der Erzeugung von a, b und c solltest du noch Standardwerte nachreichen, ansonsten kommt bei der Addition nur Mumpitz raus.
Der Code würde gar nicht kompilieren, weil kein Defaultkonstruktor vorhanden ist. Aber wie die Objekte erzeugt werden, ist in dem Beispiel nebensächlich...
pumuckl
Moderator

Benutzerprofil
Anmeldungsdatum: 21.06.2005
Beiträge: 7326
Beitrag pumuckl Moderator 18:44:43 11.06.2012   Titel:   Re: Tip Top            Zitieren

Nexus schrieb:
wie die Objekte erzeugt werden, ist in dem Beispiel nebensächlich...
Richtig. Ein weitgehend vollständiges beispiel für so eine Rational-Zahlenklasse findest du im zweiten und dritten Teil des Artikels.

_________________
Du brauchst Hilfe? - Forenregeln. Den richtigen Code posten - machs uns einfacher dir zu helfen
Don't feed the Help Vampires!
Sone
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 3473
Beitrag Sone Mitglied 12:52:20 19.08.2012   Titel:              Zitieren

Btw, jetzt mit C++11 können einige Operatoren wie operator?: überladen werden. Kommt dazu noch was?

_________________
You want to do X, and you think Y is the best way of doing so. Instead of asking about X, you ask about Y. | Code ist kein Haufen von wahllos zusammengeschmissenen Buchstaben und Zeichen, Code ist Logik pur.
pyhax
Mitglied

Benutzerprofil
Anmeldungsdatum: 22.11.2011
Beiträge: 692
Beitrag pyhax Mitglied 13:35:13 19.08.2012   Titel:              Zitieren

Sone schrieb:
Btw, jetzt mit C++11 können einige Operatoren wie operator?: überladen werden. Kommt dazu noch was?


Wo hast du das den her?

_________________
Ich kann (teilweise): C++, Python, Java(ist lange her), PHP, D (Anfänger)
Sone
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 3473
Beitrag Sone Mitglied 16:58:42 19.08.2012   Titel:              Zitieren

pyhax schrieb:
Sone schrieb:
Btw, jetzt mit C++11 können einige Operatoren wie operator?: überladen werden. Kommt dazu noch was?


Wo hast du das den her?


Mein Fehler, hab mich im Standard verguckt. Siehe 13.6.24, war schon ne Weile her, hab mich falsch erinnert... :D

_________________
You want to do X, and you think Y is the best way of doing so. Instead of asking about X, you ask about Y. | Code ist kein Haufen von wahllos zusammengeschmissenen Buchstaben und Zeichen, Code ist Logik pur.
Zsar
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.09.2008
Beiträge: 22
Beitrag Zsar Mitglied 08:56:23 15.11.2012   Titel:              Zitieren

Mmh, wäre es möglich, Beispiele für die Überladung von operator-> und operator->* zu bekommen? Insbesonders, da das hier anders als der Artikel zu behaupten scheint, dass typ * operator->() für den Zugriff auf Elemente von typ gedacht ist (mag aber auch einfach nur schlecht formuliert sein).

... Kann mir nicht recht vorstellen, wie man das zu verwenden hat.

Ich glaube, dass ich damit elegant dieses Ding hier vereinfachen könnte:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef struct Nest
{
  double wert;
  double * koordinaten;
  double * wertigkeiten;
}
 
Nest * LeeresNest(const size_t & dimension, const size_t & bewohner)
{
  Nest * ausgabe = (Nest *)operator new(2 * sizeof(double *) + (1 + dimension + bewohner) * sizeof(double));
  ausgabe->koordinaten  = (double *)(&ausgabe->wertigkeiten + 1);
  ausgabe->wertigkeiten = ausgabe->koordinaten + dimension;
 
  return ausgabe;
}
(siehe dieses Thema, falls die Motivation kümmert)

Weiterhin:
Wenn ich mir diesen überladenen Operator anschaue:
Code:
vector<T,Allocator>& operator= (const vector<T,Allocator>& x);
dann wird derselbe so benutzt:
Code:
vector a;
vector b = a;


Mit diesem hier:
Code:
void* operator new (std::size_t size) throw (std::bad_alloc);
sollte die Verwendung also dergestalt aussehen:
Code:
Nest * (Nest *)new 2 * sizeof(double *) + (1 + dimension + bewohner) * sizeof(double);
Funktioniert aber nicht - die Syntax aus dem oberen Beispiel ist erforderlich. Wie kommt das?

Gleichsam wird aus
Code:
void* operator new (std::size_t size, void* ptr) throw();
in der Anwendung nicht etwa
Code:
new <wert> <zeiger>;
sondern eines von diesen beiden:
Code:
operator new(<wert>, <zeiger>); // keine Ahnung, wie hier der Konstruktor zu wählen wäre
new (<zeiger>) <Konstruktor>;
Praktisch. Aber woher!?


Zuletzt bearbeitet von Zsar am 09:26:07 15.11.2012, insgesamt 3-mal bearbeitet
c++.de :: Die Artikel ::  Überladung von Operatoren in C++ (Teil 1)  
Gehen Sie zu Seite Zurück  1, 2
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.