Blutige Anfängerfrage
-
Hey Leute!
Ich bin völlig neu in C++, schreibe aber am Do ne Klausur drüber..

Schaue mir das Zeug gerade mal an und es klappt auch ganz gut. Nur eine Frage habe ich:
Rufen Objekte Methoden auf, so passiert das manchmal mit
- Objekt.methode();
- Objekt::methode();
- Objekt->methode();
Worin liegt denn der Unterschied??? (Ich nehm mal an, dass das mit Objekt und Methode so stimmt, ihr könnt mich aber gern belehren...
)Danke für die Hilfe!!
-
Der .-operator wird bei normalen Objekten mit normalen Eigenschaften/Methoden genutzt.
Das Zweite Beispiel ist, was bei statischen Methoden/Eigenschaften genutzt wird (die nur einmal im Speicher für alle Instanzen verfügbar sind).
-> ist der Pfeiloperator, der bei Zeigern eingesetzt wird... wenn du über Zeiger auf Eigenschaften/Methoden einer Klasse zugreifen willst.
Edit: Es ist die Kurzform für
(*DerZeiger).DasAttribut//Der Punkt-Operator geht vor DerZeiger->Attribut
-
edit: zu spät
bei 1. wird eine instanz auf z.b. die klasse class ABC erstellt : also
ABC meinabc;class ABC enthält die Funktion void ABC::aA(){}
um die funktion aufzurufen :meinabc.aA();bei 3. macht man das ganze mit pointern.
wenn man z.B. einen konstruktor von der class ABC hat könnte man
ABC* meinabc = new ABC();die funktion aA zum Aufrufen sieht nun so aus :
meinabc->aA();
-
Klasse Objekt; Objekt.methode(); //"normaler" ZugriffObjekt::methode(); //Möglich, aber sinnlos //Wird normalerweise so verwendet: class Foo { public: static void methode() { /*...*/ } //Muss static sein! }; //... Foo::methode();Klasse *Objekt = new Klasse; //Pointer Objekt->methode(); //Kombiniert Dereferenzierung und Methodenzugriff. //Auch möglich: (*Objekt).methode();EDIT: Soldat meldet sich zur Liegestütz-Strafe, wegen Verspätung
-
Find ich unglücklich formuliert Hacker.
Hacker schrieb:
Der .-operator wird bei normalen Objekten mit normalen Eigenschaften/Methoden genutzt.
Was sind den unnormale Objekte.
Hacker schrieb:
Das Zweite Beispiel ist, was bei statischen Methoden genutzt wird.
namespaces?
-
Mit dem .-Operator greift man auf Attribute und Methoden einer Klasse zu. Links von ihm steht ein Objekt der entsprechenden Klasse.
-
Mit dem Scope-Operator ( :: ) gibst du eine Zugehörigkeit an. Wird z.B. verwendet, um auf statische Attribute und statische Methoden zuzugreifen, oder um Dinge in einem namespace anzusprechen oder um Methoden einer Klasse außerhalb zu definieren, etc.
-
Mit dem ->-Operator greift man auf Attribute und Methoden einer Klasse zu. Links von ihm steht aber ein Zeiger, und kein Objekt.
-
-
Gugelmoser schrieb:
Find ich unglücklich formuliert Hacker.
Hacker schrieb:
Der .-operator wird bei normalen Objekten mit normalen Eigenschaften/Methoden genutzt.
Was sind den unnormale Objekte.
Gut, formulier es anders...

Gugelmoser schrieb:
Hacker schrieb:
Das Zweite Beispiel ist, was bei statischen Methoden genutzt wird.
namespaces?
Gehts um namespaces? Sonst können wir auch über'n scope-operator reden.
-
Hacker schrieb:
Gehts um namespaces? Sonst können wir auch über'n scope-operator reden.
Ne, aber ich denke in diesem Fall findet es der Threadersteller gut, wenn man ein kleines bischen über den Tellerrand hinausschaut, und ihm sagt, wo es unter anderem noch eingesetzt wird.

-
danke!
Hier eine nächste Frage:
Es geht hier um eine Matrix, was bedeutet das "double** data_;"
8 c l a s s Matrix 9 { 10 publ ic : 11 Matrix ( int rows , int c o l s ) ; 12 Matrix ( const Matrix& m) ; 13 ~Matrix ( ) ; 14 double getRows ( ) const ; 15 double getCol s ( ) const ; 16 Matrix& operator =( const Matrix& m) ; 17 double operator ( ) ( int row, int col ) const ; 18 double& operator ( ) ( int row, int col ) ; 19 20 pr iva te : 21 int rows_ ; 22 int col s _ ; 23 double data_ ;Ein "" ist mir klar, das ist ein Pointer auf ein Objekt. Aber was bedeuten zwei?? Ist das etwa als eine Art zweidimensionales Array zu verstehen? Dass, wenn data_ auf ein Objekt zeigt, dieses nochmals mit einem "*" auf andere Objekte zeigen kann?
Danke für die Hilfe!
-
Blub85 schrieb:
was bedeutet das "double** data_;"
Du musst eine Deklaration von rechts nach links lesen: data_ ist ein Zeiger auf einen Zeiger, der auf eine double-Variable zeigt.
Also: data_ ---> irgendein anderer Zeiger ---> double-Variable
-
Blub85 schrieb:
...Ist das etwa als eine Art zweidimensionales Array zu verstehen? Dass, wenn data_* auf ein Objekt zeigt, dieses nochmals mit einem "*" auf andere Objekte zeigen kann?
Danke für die Hilfe!
Exakt

-
Gugelmoser schrieb:
Du musst eine Deklaration von rechts nach links lesen: data_ ist ein Zeiger auf einen Zeiger, der auf eine double-Variable zeigt.
Also: data_ ---> irgendein anderer Zeiger ---> double-VariableDas führt zwar in diesem Fall zu einem brauchbaren Ergebnis, ist aber im Allgemeinen falsch. Wie man eine Deklaration tatsächlich liest, zeigt z.B. dieser Artikel: http://www.codeproject.com/KB/cpp/complex_declarations.aspx
-
exakter schrieb:
Exakt

Hör auf zu trollen.
-
hmpf schrieb:
Gugelmoser schrieb:
Du musst eine Deklaration von rechts nach links lesen: data_ ist ein Zeiger auf einen Zeiger, der auf eine double-Variable zeigt.
Also: data_ ---> irgendein anderer Zeiger ---> double-VariableDas führt zwar in diesem Fall zu einem brauchbaren Ergebnis, ist aber im Allgemeinen falsch. Wie man eine Deklaration tatsächlich liest, zeigt z.B. dieser Artikel: http://www.codeproject.com/KB/cpp/complex_declarations.aspx
Du hast natürlich recht, die einfache Regel "ließ von rechts nach links" kann man nur bei trivialen Deklarationen anwenden und nicht mehr bei komplexeren. Hab dazu auch nochmal Links gefunden: http://ieng9.ucsd.edu/~cs30x/rt_lt.rule.html und http://de.wikibooks.org/wiki/C++-Programmierung/_Weitere_Grundelemente/_Felder
exakter schrieb:
Blub85 schrieb:
...Ist das etwa als eine Art zweidimensionales Array zu verstehen? Dass, wenn data_* auf ein Objekt zeigt, dieses nochmals mit einem "*" auf andere Objekte zeigen kann?
Exakt

Ein ** hat doch gar nichts mit einem 2d-Array zu tun.
-
Gugelmoser schrieb:
hmpf schrieb:
Gugelmoser schrieb:
Du musst eine Deklaration von rechts nach links lesen: data_ ist ein Zeiger auf einen Zeiger, der auf eine double-Variable zeigt.
Also: data_ ---> irgendein anderer Zeiger ---> double-VariableDas führt zwar in diesem Fall zu einem brauchbaren Ergebnis, ist aber im Allgemeinen falsch. Wie man eine Deklaration tatsächlich liest, zeigt z.B. dieser Artikel: http://www.codeproject.com/KB/cpp/complex_declarations.aspx
Du hast natürlich recht, die einfache Regel "ließ von rechts nach links" kann man nur bei trivialen Deklarationen anwenden und nicht mehr bei komplexeren. Hab dazu auch nochmal einen Link gefunden: http://ieng9.ucsd.edu/~cs30x/rt_lt.rule.html
exakter schrieb:
Blub85 schrieb:
...Ist das etwa als eine Art zweidimensionales Array zu verstehen? Dass, wenn data_* auf ein Objekt zeigt, dieses nochmals mit einem "*" auf andere Objekte zeigen kann?
Exakt

Ein ** hat doch gar nichts mit einem 2d-Array zu tun.
In einer klasse die Matrix heißt würd ich da aber schon wetten drauf abschließen...
-
exakter schrieb:
In einer klasse die Matrix heißt würd ich da aber schon wetten drauf abschließen...
Thematisch aber nicht direkt! Zeiger auf 'nen Zeiger ist nicht wie ein 2D-Feld zu verstehen. Hör auf Schwachsinn zu posten!
-
Genau, weil man ja auch nicht auf seine frage (welche im kontext nunmal beinhaltet, dass es ein 2d array ist) eingehen sollte, sondern erstmal mit theoretischen dingen zuschmeißen, so dass er garnichts versteht. Komm mal runter...