Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Umwandlungsoperator

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
11.03.2006, 18:47 Uhr
ref



Mit einer Umwandlungsoperator , kann man ein klasse objekt zu type int oder char umwandlen wie in diesem code mit :

operator int();



C++:


// Umwandlungsoperator

#include <iostream>
#include<string.h>



class Counter

{

public:

     Counter();

     Counter(int val);

     ~Counter(){}

     int GetItsVal()const { return itsVal; }

     void SetItsVal(int x) {itsVal = x; }

     operator int();

private:

     int itsVal;

};



Counter::Counter():

itsVal(0)

{}



Counter::Counter(int val):

itsVal(val)

{}

Counter::operator int()

{

          return ( int (itsVal) );

}





int main()

{

     Counter ctr(5);

    
     int theShort=ctr;
    

     std::cout << "theShort: " << theShort << std::endl;
std::cout << "ctr: " << ctr << std::endl;

     return 0;

}









oder zu type CHAR wie


C++:
// Umwandlungsoperator

#include <iostream>
#include<string.h>



class Counter

{

public:

     Counter();

     Counter(int val);

     ~Counter(){}

     int GetItsVal()const { return itsVal; }

     void SetItsVal(int x) {itsVal = x; }

     operator char();

private:

     int itsVal;

};



Counter::Counter():

itsVal(0)

{}



Counter::Counter(int val):

itsVal(val)

{}

Counter::operator char()

{

          return ( char (itsVal) );

}





int main()

{

     Counter ctr(5);

    
     char theShort=ctr;
    

     std::cout << "theShort: " << theShort << std::endl;
     std::cout << "ctr: " << ctr << std::endl;

     return 0;

}





Nun möchte ich

char operator[] (int a1); ODER
char operator (int a1) const einsetzen

was ist der unterschied , macht dieser operator die selbe aufgabe ?
und wie soll die initialisierung aussehen , was muss man ändern ?, um fehlerfrei
zu kompilieren ?
--
Man kann ein Problem nicht mit der gleichen Denkweise lösen, mit der es erschaffen wurde. (Albert Einstein)

Dieser Post wurde am 11.03.2006 um 18:51 Uhr von ref editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.03.2006, 13:56 Uhr
RHBaum



Operatoren sind dazu da, code quasi wohlgeformt schreiben zu koennen ... also sozusagen eine intuitive Darstellungsmoeglichkeit zu geben, wie man sie von den eingebauten datentypen teils gewohnt ist (+,-,/,*,=,==,<,> ... etc) .... oder funktionalitaeten so zu verstecken das man mit klassen normal umgehen koennte als waer es ne andere (->,*,&.

Man sollte aber auch sehr vorsichtig mit sein:

deine counterklasse hat nen int als member.
mit nem operator char() wuerdest du der klasse das aussehen nach aussen eines chars geben ... warum ? was passiert wenn dein zaehler auf 127 steht und du addest noch mal 1 ....
dein int wuerd auf 128 stehen, ueberall wo du eine impliziete konvertierung ueber den char operator verwendest, wuerde das ding ploetzlich auf -128 stehen ?
Ist das intuitiv ?

kann dein counter uberhaupt negativ werden ?

mit explizieten typ operatoren sollt man soweiso sehr vorsichtig sein, lieber 2 mal ueberlegen .,.. und sich nen funktionsnamen merken . Wenn du das teil als parameter fuer ne funktioneinsetzt, und die typen ned ganz uebereinstimmern, ist teilweisse dan unbestimmt welchen operator er benutzt um auf den typ zu kommen ...

char operator[] (int a1);
Index operator ...
wemm jemand schreibt x[3] dann geht jeder programmierer davon aus, das man damit das 4te element in ner Folge meint .... bei deiner counterklasse haett er nix zu suchen .,...


operator (int X) ist nen functionscall operator ....
wenn man F(x) schreiben will und F nicht nur ne reine funktion sondern etwas mehr dahinter steckt. Nen functor also.
Ist dein counter definitiv auch nicht, quasi auch dieser operator hat an deiner klasse nichts zu suchen ...

wenn du es trotzdem machst, wirst du viel verwirrung stiften und dein code iss alles andere als intuitiv. Programmierer die deine klasse wiederverwenden muessen (vielleicht du selber in paar jahren ^^) werden dich dafuer hassen ! ^^

deine "Umwandlungen" wurd ich lieber in Funktionen packen ....
also


C++:
counter c(5);
char x1 = c.toChar();


ist viel ungefaehrlicher und auch intuitiver ^^

Der name einer klasse traegt genau so zur verstaendlichkeit bei .
Also counter impliziet sagt das es sich da irgendwie um nen zaehler handelt. Was mach man mit zaehlern ueblicherweise ?

richtig increment, decrement ...

also versuch dich lieber mal an den operator ++() und operator --() ...
und das als pre und post version ^^

weiterhin willst zaehler sicher vergleichen koennen
bool operator ==(const counter & rx) const ;

oder zaehler zuweisungen ....
counter & operator = (const counter & rx );

Wenn du dich unbedingt an operatoren auslassen willst, hasst da schon bisserl zum spielen ^^ ohne gleich gegen alle regeln der programmierkunst zu verstossen

Ciao ...

Dieser Post wurde am 13.03.2006 um 14:10 Uhr von RHBaum editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.03.2006, 13:58 Uhr
virtual
Sexiest Bit alive
(Operator)


Vorweg erstmal:
Du solltest Dir angewöhnen, mit dem Umwandlungsoperator sparsam umzugehen. Und wenn Du ihn tatächlich benutzt, dann solltest Auf Contructoren verzichten können, welche als Argument den umgewandelten Typ benutzen. So geschehen in Deinem Beispiel:

C++:
     Counter(int val);
...
     operator int();


Der Grund ist, daß man sonst immer wieder in Situationen reinläuft, die für den Compiler nicht mehr eindeutig auflösbar sind. (Ausdiesem grund bietet zB std::string keinen const char* umwandlungs operator an, siondern macht dies über die Routine c_str()).

Zitat:

Nun möchte ich

char operator[] (int a1); ODER
char operator (int a1) const einsetzen

was ist der unterschied , macht dieser operator die selbe aufgabe ?
und wie soll die initialisierung aussehen , was muss man ändern ?, um fehlerfrei
zu kompilieren ?


Also der Unterschid is, daß ersters eine gültige und zweiteres eine ungültige Operator deklaration darstellt. Vermutlich wolltest Du

C++:
char operator[] (int a1) const;
char operator () (int a1) const;


Schreiben?
- Naja, der Unterschied ist einfach, daß es unterschiedliche Operatoren sind. Da Du sie implementierst, bist Du auch dafür verantwortlich, daß sie sich an die allg. erwattete Semantik halten. Dh wenn Du schreibst:

C++:
Counter c;
char a;
a = c[133]; // op[] überladen


Dann würde man wohl erwarten, daß der op[] das Element mit dem Index 133 aus c zurückliefert (was auch immer das ist). Macht diese dein Operator nicht, ist er per se schlecht, weil er es die lesbarkeit des Sources extrem erschwert.

Wenn Du schreibst

C++:
Counter c;
char a;
a = c(133); // op() überladen


Würde man in der Regel vermutlich erwarten, daß Counter ein Funktor ist, also quasi eine Instantiierbare Funktion. Diese werden in der STL ganz gerne in verbindung mit Algorithmen verwendet.


Generell würde ich mit überladenen Operatoren sehr vorsichtig sein: Operatoren verstecken jede Menge Programmlogik. Und Programmlogik, die nicht direkt sichtbar ist, erschwert das Verstehen von Programmen.
Speziell in Deinem Fall gibt es keinen Grund, den op() zu überladen. Da Du ja schon ein GetItsValue hast, ist es sogar redundant.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.03.2006, 14:01 Uhr
virtual
Sexiest Bit alive
(Operator)


Oh, war ich zu spät. Aber doppelt hält besser
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.03.2006, 15:07 Uhr
ref



danke für eure erklärungen


char operator () (int a1) const; // diese übrigens soll char operator[] (int a1) const; sein; ich habe
die [] vergessen zu schreiben vielleicht gibt es gar kein char operator () (int a1) const;

also igentlich mit operatoren wollte ich nicht alles auf einmal zu tun habe, liebe mit einem
einfache operator wie im beispiel anzufangen , und dann mal gucken langsam mit den andern,
manchmal liest man in einem buch detalierte und einfache beispiele und dann in einer kapital plötzlich alles in einem code geschriben , es nervt manchmal , teil eines code zu ignorieren ohne es zu verstehen.

danke nochmal
--
Man kann ein Problem nicht mit der gleichen Denkweise lösen, mit der es erschaffen wurde. (Albert Einstein)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: