C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Vegleichs-Operator global oder Klassenspezifisch

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
helmut.weil@t-online.de
Guest





PostPosted: Wed May 03, 2006 11:16 am    Post subject: Vegleichs-Operator global oder Klassenspezifisch Reply with quote



Hallo,

kann mir mal jemand sagen, wieso man zwei unterschiedliche == -
Operatoren schreiben kann, die doch das Gleiche bewirken, gleichgültig
ob sie als global oder Klassenspezifisch deklariert sind ?

#define ZWEI
class C
{
int a, b;
public:
C():a(3), b(4) {}
C(int p):a(p), b(p) {}
#ifdef ZWEI
friend bool operator == (C a, C b);
#else
bool operator == (C c);
#endif
};

#ifdef ZWEI
bool operator == (C a, C b)
{
if(a.a == b.a)
return true;
return false;
}
#else
bool C::operator == (C c)
{
if(this->a == c.a)
return true;
return false;
}
#endif

void gleich_op()
{
int x;
C a, b;
if(a == b) x = 8;
else x = 3;
}

Die Funktion liefert in beiden Fällen (#define .....) das Gleiche

Danke

Helmut

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
kanze
Guest





PostPosted: Thu May 04, 2006 9:25 am    Post subject: Re: Vegleichs-Operator global oder Klassenspezifisch Reply with quote



helmut.weil@t-online.de wrote:

Quote:
kann mir mal jemand sagen, wieso man zwei unterschiedliche ==
- Operatoren schreiben kann, die doch das Gleiche bewirken,
gleichgültig ob sie als global oder Klassenspezifisch
deklariert sind ?

Damit man einen oder den anderen verwenden kann, je nach dem,
was man will. Der Vorteil des Mitglieds ist, dass er auf allem
zugreifen kann, ohne dass er friend sein muss. Der Vorteil der
freien Funktion ist, dass implizierte Umwandlungen auch auf dem
rechten Parameter stattfinden kann.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Clemens Hintze
Guest





PostPosted: Thu May 04, 2006 12:23 pm    Post subject: Re: Vegleichs-Operator global oder Klassenspezifisch Reply with quote



On 3 May 2006 00:16:28 -0700
"helmut.weil@t-online.de" <helmut.weil@t-online.de> wrote:

Quote:
Hallo,

Hallo,

Quote:
kann mir mal jemand sagen, wieso man zwei unterschiedliche == -
Operatoren schreiben kann, die doch das Gleiche bewirken, gleichgültig
ob sie als global oder Klassenspezifisch deklariert sind ?

damit der Compiler eventuelle Konvertierungsmöglichkeiten finden und
nutzen kann. Bei Deinem Beispiel:

Quote:

#define ZWEI
class C
{
int a, b;
public:
C():a(3), b(4) {}
C(int p):a(p), b(p) {}
(...)
};

*muss* im Falle nicht ZWEI das Objekt auf der linken seite von '==' ein
C sein, um Deinen C::operator==() zu rufen. Also so:

C c1, c2;
c1 == c2; // OK
c1 == 12; // OK, da der Compiler c1 == C(12) daraus macht.

Wenn Du denn Operator hingegen als friend definierst (also Dein
Fall ZWEI), dann kann der Compiler auch dies:

12 == c1;

Weil er daraus ein C(12) == c1 macht! So etwas kann manches mal recht
nützlich sein. Insbesondere, wenn Du vielleicht verkettete Ausdrücke
hast. :-)


Ciao,
Clemens.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
helmut.weil@t-online.de
Guest





PostPosted: Fri May 05, 2006 10:21 am    Post subject: Re: Vegleichs-Operator global oder Klassenspezifisch Reply with quote

Voila !!!!
wieder was gelernt.

Danke

Helmut Weil

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
kanze
Guest





PostPosted: Fri May 05, 2006 11:21 am    Post subject: Re: Vegleichs-Operator global oder Klassenspezifisch Reply with quote

Clemens Hintze wrote:
Quote:
On 3 May 2006 00:16:28 -0700
"helmut.weil@t-online.de" <helmut.weil@t-online.de> wrote:

kann mir mal jemand sagen, wieso man zwei unterschiedliche
== - Operatoren schreiben kann, die doch das Gleiche
bewirken, gleichgültig ob sie als global oder
Klassenspezifisch deklariert sind ?

damit der Compiler eventuelle Konvertierungsmöglichkeiten
finden und nutzen kann. Bei Deinem Beispiel:

#define ZWEI
class C
{
int a, b;
public:
C():a(3), b(4) {}
C(int p):a(p), b(p) {}
(...)
};

*muss* im Falle nicht ZWEI das Objekt auf der linken seite von
'==' ein C sein, um Deinen C::operator==() zu rufen.

Nicht ganz genau. Abgeleitete Klassen gehen auch. Ein neues
Objekt wird aber nicht als Ergebnis einer Umwandlung
eingerichtet; es muss also möglich sein, die Funktion direkt auf
dem vorhandenen Objekt aufzurufen.

In vielen Fällen spielt das keine Rolle. (Wenn z.B. alle
Constructoren explicit sind.)

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Clemens Hintze
Guest





PostPosted: Mon May 08, 2006 10:33 am    Post subject: Re: Vegleichs-Operator global oder Klassenspezifisch Reply with quote

On 5 May 2006 03:56:48 -0700
"kanze" <kanze@gabi-soft.fr> wrote:

(...)

Quote:
*muss* im Falle nicht ZWEI das Objekt auf der linken seite von
'==' ein C sein, um Deinen C::operator==() zu rufen.

Nicht ganz genau. Abgeleitete Klassen gehen auch. Ein neues
Objekt wird aber nicht als Ergebnis einer Umwandlung
eingerichtet; es muss also möglich sein, die Funktion direkt auf
dem vorhandenen Objekt aufzurufen.

Okay, ich war nicht ganz eineindeutig. Wenn D->C dann gilt für mich
immer, dass D ein C *ist* (is-a). Aber Du hast recht, man hätte es auch
misverstehen können. Danke daher für die Klarstellung :-)

Ciao,
Clemens.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.