Forum: PC-Programmierung C++: *(*a).get_b()


von Maxim (maxim) Benutzerseite


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?

ja

von Maxim (maxim) Benutzerseite


Lesenswert?

Cool, das wollte ich wissen ...
1
*a->get_b()

von Yalu X. (yalu) (Moderator)


Lesenswert?

Maxim S. schrieb:
> *(*a).get_b()

Maxim S. schrieb:
> *a->get_b()

Beides ist nicht richtig.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Vor allem: Wo ist z?

von Kirk (Gast)


Lesenswert?

Und wenn ja wie viele?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Maxim S. schrieb:
> Gegeben sei ein Zeiger z auf ein Objekt a der Klasse A.
1
A a;
2
3
A* z = &a;

Das steht da.

Insofern ist bereits der Ansatz
1
*(*a).get_b()
falsch.

von Maxim (maxim) Benutzerseite


Lesenswert?

Ihr habt ja alle recht, es sollte
1
*(*z).get_b()
heißen. Das kann ich ersetzen durch:
1
*z->get_b()

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Maxim S. schrieb:
> heißen. Das kann ich ersetzen durch:
>  *z->get_b()

Das ist nicht besser.

Warum dereferenzierst Du den Pointer zweimal?

z ist deklariert als A*, nicht als A**.

von Maxim (maxim) Benutzerseite


Lesenswert?

Ich dereferenziere ja den Pointer, den mir get_b zurückgibt und er auf b 
zeigt.

von NaPS (Gast)


Lesenswert?

Der Thread ist ein Paradebeispiel dafür wie schnell man sich bei der 
Zeigerei die C++ erlaubt "verzeigert".

;-)

von (prx) A. K. (prx)


Lesenswert?

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.

von Yalu X. (yalu) (Moderator)


Lesenswert?

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.

von Mark B. (markbrandis)


Lesenswert?

Maxim S. schrieb:
> Ich dereferenziere ja den Pointer, den mir get_b zurückgibt und er auf b
> zeigt.

Und wozu? Du hast nun einen Zeiger auf ein erzeugtes Objekt. Wenn Du 
irgendwas mit diesem Objekt machen willst, dann mach's doch über diesen 
Zeiger.

von (prx) A. K. (prx)


Lesenswert?

Yalu X. schrieb:
> die richtige Lösung.

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

von Yalu X. (yalu) (Moderator)


Lesenswert?

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 :)

von Karl H. (kbuchegg)


Lesenswert?

Die Frage ist doch eher: Warum rückt a einen Pointer auf einen seiner 
Member freiwillig raus?

von (prx) A. K. (prx)


Lesenswert?

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

von Yalu X. (yalu) (Moderator)


Lesenswert?

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 ;-)

von (prx) A. K. (prx)


Lesenswert?

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.

von Thomas K. (muetze1)


Lesenswert?

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!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.