Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » kein plan

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 ] > 2 < [ 3 ]
010
30.06.2003, 16:40 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Meinst du vielleicht operatorüberladung bei Klassen.
z.B. sowas?


C++:
class complex {

    public:                
       double Re, Im;
    
       complex(){};
        complex(complex&): Re(c.Re),Im(c.Im){};
        complex operator+ (complex c){ complex aux(Re+c.Re, Im+c.Im); return aux; };
        complex operator- (complex c){ complex aux(Re-c.Re, Im-c.Im); return aux; };
        complex operator* (complex c){ complex aux(Re*c.Re-Im*c.Im, Im*c.Re+Re*c.Im);return aux; };
}



Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
30.06.2003, 16:46 Uhr
VesaMan



aja ganau und das geht doch auch mit dem operator-> oder? weißt du noch was dazu weiß nicht ganz was das auf sich hat oder generll operator überladung obwohl ich die eigentlich gerafft hab
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
30.06.2003, 16:52 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


hm mal schaun.

Ja, das soll wohl auch mit dem Operator -> gehen wobei mir jetzt spontan kein Beispiel dazu einfällt.

Aber was es damit aufsich hat kann ich dir erklären.

Also wenn du zwei Zahlen hast. z.b. 3 und 4 dann ist es eigentlich relativ klar was denn der Operator + oder - in bezug auf die beiden zahlen zu bedeuten hat.

Wenn du aber eine eigene Klasse definierst, die mehrere Attribute hat, musst du selber definieren was die Operatoren bewirken.

Um mal ein bispiel zu machen. Du hast die Klasse PKW. Die Klasse Pkw haben die Attribute farbe und geschwindigkeit.

Nun erstellst du zwei Objekte der Klasse mypkw1 und mypkw2.
Nun ist es nicht definiert was mypkw1 + mypkw2 sein soll.

Die frage hierbei ist auch ob das überhaupt sinnvoll ist die addition von zwei pkws zu defnieren man kann es aber machen.

deswegen habe ich dir das obige beispiel mit der "komplexen" Klasse gepostet, weil es hierbei sinnvoll ist die operatoren zu überladen

Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
30.06.2003, 18:38 Uhr
Pablo
Supertux
(Operator)


Der Operator -> ist kein Operator. (Das ist falsch!!!, Dank an @virtual) Wenn du auf die Members einer Klasse bzw. Struct zugreifen willst, benutzt du Object.member.

Bsp:

C++:
typedef struct {
char* name;
int number;
} EGALWAS;

int main()
{
    EGALWAS var1;
    var1.name = "Pablo";
    var1.number = 1;
}



Wenn du einen Pointer deklarierst, dann Object->member

C++:
typedef struct {
char* name;
int number;
} EGALWAS;

int main()
{
    EGALWAS var1;
    var1.name = "Pablo";
    var1.number = 1;
    EGALWAS* pointeraufvar1 = &var1;
    pointeraufvar1->name = "VesaMan";
    pointeraufvar1->number = 2;
}


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 30.06.2003 um 18:47 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
30.06.2003, 18:45 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
Pablo Yanez Trujillo postete
Der Operator -> ist kein Operator.

Klar ist das ein Operator. Und zB die ganzen STL Iteratoren überladen ihn.
--
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
015
30.06.2003, 18:47 Uhr
Pablo
Supertux
(Operator)


Ach so, schön zu wissen, ich hab noch nicht einen Source Code gesehen, wo -> überladen wird. Und wozu überlädt man denn diesen Operator?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
30.06.2003, 19:25 Uhr
virtual
Sexiest Bit alive
(Operator)


Naja, wie gesagt Iteratoren benutzen das zB. Nehmen wir mal die std::map

C++:
std::map<std::string, int> mapScores;


Um es ein weing Anschaulicher zu gestalten stellen wird und unter mapScores eine Map vor, die die Highscroes von den jeweiligen Benutzern zu einem Spiel speichert. Wie hoffentlich bekannt werden die einzelnen Spieler/Score Paare in einer std::map als ein sortierter Baum von std::pair Instanzen gespeichert. Dh man kann sich mapScores vorstellen als eine Ansammlung von Instanzen von

C++:
std::pair<std::string, int>;


Ein std::pair hat zwei Komponenten, nämlich first und second. Wenn ich einen Pointer auf ein std::pair habe, kann ich also so den User/Punktzahl ausgeben:

C++:
std::pair<std::string, int>* ppair;
std::cout<<ppair->first<<" hat "<<ppair->second<<" Punkte."<<std::endl;


Nun wollen wir wissen,
1. Ob pablo schon mal gespielt hat
2. Welche Punbktzahl der hatte
Der entsprechende Code sieht dann so aus:

C++:
    std::map<std::string, int>::const_iterator ppair = mapScores.find("Pablo");
    if (mapScores.end() != ppair)
    {
       std::cout<<ppair->first<<" hat "<<ppair->second<<" Punkte."<<std::endl;
    }else
    {
       std::cout<<"Pablo hat noch nie gespielt"<<std::endl;


Genau hingeguckt? - dann hast Du gesehen, daß hier ppair plötzlich ein Iterator ist, welcher mit an Sicherheit grenzender Wahrscheinlichkeit bei keiner Implementierung ein normaler Pointer auf ein pair ist.
Der Operator -> wird hier also so verwendet um den Benutzer zu ermöglichen, den Iterator wie ein Pointer auf das Objekt von Interesse einzusetzen. Genau kann auch mit dem Unären * verfahren werden.
Generell kann man mit Den ->, unären * und unären & dem Benutzer ein anderes Objekt vorgauckeln, als tatsächlich existiert. Bitte mit Vorsicht und gebotenem Respekt anwenden, kann tief in die Hose gehen!
--
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
017
30.06.2003, 19:30 Uhr
VesaMan



Überladen des -> (Dereferenzierungs) Operators
Mit einer (nicht-statischen) Elementfunktion zu überladen
Zugriff auf member eines Objektes der Klasse
Klasse verhält sich dabei wie ein Zeiger
Operator ->:
Ist Operand ein Zeiger
• Gelange von dem Zeiger aus zu einem Attribut oder einer
Methode des Objektes der Klasse
Ist Operand ein Objekt oder eine Referenz auf ein Objekt
• Ist der -> Operator überschrieben?
– Ja: Verwende entsprechende Methode
– Nein: Syntaxfehler

©
Überladen des -> Operators (fortgesetzt)
Der Operator -> ist ein unärer Operator, der auf seinen linken
Operand wirkt
Rückgabetyp ist Zeiger auf struct oder class :
Zeiger wird sogleich dereferenziert
• pt->foo() entspricht (pt.operator->())->foo()
Als überladener Operator kann er aber (zuvor) noch einiges
erledigen,
• z.B. sicherstellen, dass der Zeiger auch gültig ist
Rückgabetyp ist Objekt oder Referenz auf Objekt
Operation wird rekursiv angewandt, bis Rückgabetyp ein
Zeiger ist oder ein fehler auftritt

Überladen des -> Operators (fortgesetzt)
Hauptanwendung: Sog. smart pointers (intelligente Zeiger)
Intelligente Zeiger:
Illegale Zugriffe über Zeiger werden abgefangen
Der Versuch, ein Objekt, auf das ein Zeiger vermeintlich
zeigt, zu vernichten, hat mit smart pointers keine
katastrophalen Auswirkungen

-> vielleicht ist jemand von euch in der lage mir das zu erkläre, ich verstehe diesen text nicht, aber darum geht es ja wohl

Dieser Post wurde am 30.06.2003 um 19:31 Uhr von VesaMan editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
30.06.2003, 21:28 Uhr
Pablo
Supertux
(Operator)


Heißt das, dass ppair kein Pointer mehr ist? Ich verstehe immer noch was nicht ganz, was ein Iterator macht, was wäre hier der Unterschied zwischen dem Pointer und dem Iterator?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
30.06.2003, 21:40 Uhr
virtual
Sexiest Bit alive
(Operator)


Ein Iterator soll sich genauso verhalten, wie ein Pointer. Abwer er ist kein Pointer. Um hinzubekommen, daß er sich so verhält, muß man die enstprechenden Operatoren überladen.
Die Sache mit dem SmartPointer ist ein ganz gutes Beispiel. Ein SmartPointer ist ein Ding, daß "weiß", wie oft ein Objekt benutzt wird und gibt dies automatisch frei, sobald es nicht mehr benutzt wird (smart_ptr sind nicht in der STL):

C++:
smart_ptr<string> str = new string("Hallo");
cout << (*str) << " ist " << str->length() << " Zeichen lang" << std::endl;


Man kann str verwenden wie einen Pointer; aber es ist kein Pointer, sondern eindeutig eine smart_ptr - Spezialisierung und damit eine Stinknormale Klasse. Aber diese Klasse hat gewisse Operatoren überladen.
--
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
Seiten: [ 1 ] > 2 < [ 3 ]     [ 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: