C++: *(*a).get_b()

OP Persönliche Seite #3071268
Gegeben sei ein Zeiger z auf ein Objekt a der Klasse A. Dieses Objekt 
hat eine Methode get_b(), die mir die Adresse eines Objektes b der 
Klasse B zurueckgibt. Wenn ich also das Objekt b von a haben moechte, 
schreibe ich:
1
*(*a).get_b()
Laesst sich das auch einfacher schreiben?
Und ebenfalls ein Paradebeispiel dafür, dass C (und damit C++) sich mit 
dem Mix aus Präfix- und Postfix-Operatoren völlig verrannt hatte. Mit 
der Dereferenzierung als Präfix- statt Postfix-Operator war das Kind im 
Brunnen.
Moderator
Maxim S. schrieb:
> Ihr habt ja alle recht, es sollte
>
> (*z).get_b()
>
> heißen. Das kann ich ersetzen durch:
>
> *z->get_b()

Ja so stimmt es. Wobei ich die Aufgabe

> Wenn ich also das Objekt b von a haben moechte,

so interpretieren würde, dass b in Abhängigkeit von a und nicht von z
gesucht ist. Dann wäre
1
*a.get_b()

die richtige Lösung.
Moderator
A. K. schrieb:
> Und ebenfalls ein Paradebeispiel dafür, dass C (und damit C++) sich mit
> dem Mix aus Präfix- und Postfix-Operatoren völlig verrannt hatte. Mit
> der Dereferenzierung als Präfix- statt Postfix-Operator war das Kind im
> Brunnen.

Wo siehst du da ein Problem? Präfixoperatoren sind in C (und auch in der
Mathematik) die Regel, Postfixoperatoren die Ausnahme (in C sind das nur
++ und --, die es als Präfix und Postfix gibt). Warum hätte man also die
Dereferenzierung als Postfixoperator definieren sollen?

A. K. schrieb:
> Wenn du diese Logik konsequent weiter verfolgst, dann kannst du ebenso
> gut auch gleich
>    b
> hinschreiben. ;-)

Ja, man müsste halt den genauen Wortlaut der Aufgabe kennen :)
Yalu X. schrieb:
> Postfixoperatoren die Ausnahme

Mitnichten. () [] und der Strukturoperator . sind je nach 
Betrachtungsweise Infix- oder parametrisierte Postfix-Operatoren, 
jedenfalls aber rechts vom Basisobjekt, die Dereferenzierung ist links. 
Genau durch dieses mal-links-mal-rechts wird es unübersichtlich.

Schon die Abkürzung
  p->x
für
  (*p).x
wurde überhaupt erst dadurch erforderlich. Mit der Dereferenzierung als 
Postfixoperator wie in Pascal ist das einfach bloss
  p^.x
und im obigen Beispiel würde
  z^.get_b()^
draus, was schlicht von links nach rechts ausgewertet wird.

Auch die insbesondere bei Anfängern unweigerlich entstehende Verwirrung 
um array-of-pointers vs. pointer-to-array in Deklarationen ergab sich 
überhaupt erst dadurch, dass es von innen nach aussen mal links mal 
rechts weiter geht, statt linear von links nach rechts. Unter den C 
Derivaten hat sich erst GO an dieses Thema heran getraut
Moderator
A. K. schrieb:
> Yalu X. schrieb:
>> Postfixoperatoren die Ausnahme
>
> Mitnichten. () [] und der Strukturoperator . sind je nach
> Betrachtungsweise Infix- oder parametrisierte Postfix-Operatoren,

Den Begriff "Parametrisierte Postfix-Operatoren" für diese Operatoren,
die weder richtig infix noch richtig postfix sind, werde ich mir merken.
Er löst einige Widersprüche auf, die entstehen, wenn man diese Operatio-
nen gewaltsam in die Infix- oder Postfix-Schublade einsortieren will.

Was die Anfängerverwirrung betrifft: Ich persönlich hatte mit der
C-Syntax nie Probleme, eher schon mit der Pascal-Syntax, wo ja der
Dereferenzierungsoprator postfix ist. Ich habe anfangs einige Zeit
gebraucht, um auswendig zu wissen, wann das '^' vor und wann es hinter
der Variablen steht (Unterschied zwischen Zeigerdeklaration und
-dereferenzierung). Vielleicht gleicht ja mein Hirn eher dem von Ritchie
als dem von Wirth ;-)
Yalu X. schrieb:
> Den Begriff "Parametrisierte Postfix-Operatoren" für diese Operatoren,
> die weder richtig infix noch richtig postfix sind, werde ich mir merken.

Ist allerdings eine ad-hoc Erfindung von mir, inspiriert von APL, wo es 
beispielsweise parametrisierte Infix-Operatoren gibt ( sowas wie a/[1]b 
). In C ist [] unweigerlich Infix, weil per Definition kommutativ, auch 
wenn das eher selten verwendet wird.
Yalu X. schrieb:
> Was die Anfängerverwirrung betrifft: Ich persönlich hatte mit der
> C-Syntax nie Probleme, eher schon mit der Pascal-Syntax, wo ja der
> Dereferenzierungsoprator postfix ist. Ich habe anfangs einige Zeit
> gebraucht, um auswendig zu wissen, wann das '^' vor und wann es hinter
> der Variablen steht (Unterschied zwischen Zeigerdeklaration und
> -dereferenzierung).

Ganz einfach: Deklaration (im gesonderten Abschnitt vor dem Code) immer 
links (prefix) und im Code kann es nur zur Dereferenzierung eingesetzt 
werden, somit rechts (postfix). Deklarationen gibt es auch immer nur 
ausserhalb des Codes. Ist eigentlich ganz einfach (halt eine 
Lehrsprache).

HTH
Muetze1

/PS: Ups, der fing ja schon an zu verwesen der Thread. Übersehen, sorry!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.