Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   was ist in c++ der "->" Operator? (https://www.delphipraxis.net/115478-ist-c-der-operator.html)

xy124 12. Jun 2008 22:39


was ist in c++ der "->" Operator?
 
ich hab mir grad' ein bisschen c++ beigebracht und jetzt stoße ich ständig gegen diesen operator (->) wenn ich zum Beispiel mit button1->text="Hallo duda" einen Text zuweisen will.
Nun interressiert mich brennend, was der unterschied zwischen "." (den Punkt nehm' ich immer bei z.B. Variablen aus eigenen Klassen)
und diesem Pfeil ist.

Auf allen Internetseiten die ich besucht habe und in diesem tollem Tutorial hier hab ich auch nichts brauchbares gefunden.

Nur von Wikipedia weiß ich der Pfeil steht für "Zugriff auf Member eines Objekts über einen Zeiger"
aber warum geht dann nicht auch button.text =... wenn ich's ohne Zeiger machen will?

Ich hoffe es gibt ein paar Delphianer unter euch, die mir diese c++ Frage beantworten können :-D

-xy124-

SirThornberry 12. Jun 2008 22:43

Re: was ist in c++ der "->" Operator?
 
der Pfeil ist das gleiche wie ein dereferenzieren und dann mit dem Punkt
also:
Code:
pointer_to_struct->struct_member = (*pointer_to_struct).struct_member;

OregonGhost 13. Jun 2008 09:58

Re: was ist in c++ der "->" Operator?
 
Zitat:

Zitat von xy124
Nur von Wikipedia weiß ich der Pfeil steht für "Zugriff auf Member eines Objekts über einen Zeiger" aber warum geht dann nicht auch button.text =... wenn ich's ohne Zeiger machen will?

Nochmal spezifischer für dein Beispiel: Weil button bereits ein Zeiger ist (in diesem Fall). Wenn du es ohne Zeiger machen willst (naja, ohne Pfeil), musst du es so machen, wie SirThornberry beschreibt, nämlich den Zeiger dereferenzieren:
(*button).text = ...
Da man in C und C++ häufig mit Zeigern hantiert, hat man diesen Pfeil als Vereinfachung eingeführt. In Delphi ist es eigentlich auch so kompliziert (Dereferenzierung mit ^), aber der Compiler schummelt etwas und man kommt nahezu immer ohne das Dach aus, jedenfalls im Alltag.

xy124 13. Jun 2008 20:58

Re: was ist in c++ der "->" Operator?
 
also kibt es in c++ von klassen auch zeiger und um den echten Wert hinter dem zeiger zu bekommen nutzt man also diesen ->
...dasnke hat mir sehr geholfen :-D
könntet ihr mir auch verraten (wenn das nicht zu kompliziert ist) wie ich jetzt z.B. von dieser Klasse:
Code:
class hund {
private:
   int age;
public:
   hund(){ //= create
      cout<<"Hund wird gebaut"<<endl;
   }
   int lieb;
   void setage(int newage) {
      age=newage;
   }
   int getage() {
      return age;
   }
   void foo(hund dummy) //destroyer, braucht als parameter einen hund, der griegt den namen dummy
    {
      dummy.setage(-1); //geiles Alter nicht
    }
};
einen Zeiger erstelle?
müsste das nicht so gehen? :
Code:
        hund bello;
   hund* derzeigerhund;
   derzeiger=&bello;
   derzeigerhund->lieb=3;
   cout<<endl<<bello.lieb;
   system("PAUSE");

1234588 13. Jun 2008 21:17

Re: was ist in c++ der "->" Operator?
 
eine klassen variable ist imho ein typisierter zeiger der auf ein objekt zeigt (sofern erstellt). in delphi ist also folgendes ein zeiger:
Delphi-Quellcode:
var
  miep: TObject;
meine zeh++ kenntnisse sind zwar eingerostet, aber soweit ich noch weiß ist es dort genauso

Apollonius 13. Jun 2008 21:41

Re: was ist in c++ der "->" Operator?
 
Du kannst dem KLassenzeiger eine Referenz zuweisen, ja, aber das ist sehr unüblich. Die klassische Verwendung sieht so aus:
Code:
hund* derzeigerhund = new hund;
//...
delete hund;

xy124 18. Jun 2008 19:40

Re: was ist in c++ der "->" Operator?
 
ok danke hat mir sehr geholfen :thumb:
aber nochmal was anderes der new-operator geht der auch, wenn man von einer eigenen klasse instanzen zur Laufzeit erstellen will?

das hier
Code:
wauwau = new hund();
funktionier jeden falls nicht :(
wie mach ich das dann?

hoffe ihr könnt mir helfen

-xy124-

SirThornberry 18. Jun 2008 20:14

Re: was ist in c++ der "->" Operator?
 
Zitat:

funktionier jeden falls nicht
:glaskugel: welche Fehlermeldung bekommst du denn? In deinem Ministück wird nirgends der Typ definiert zudem denke ich das new einen Zeiger zurück gibt so das du einen pointertyp benötigst.

folgendes funktioniert bei mir ohne probleme
Code:
TForm1* myform = new TForm1(0);

xy124 19. Jun 2008 18:40

Re: was ist in c++ der "->" Operator?
 
na alles zusammen sieht in etwa so aus:
Code:
class hund {
private:
   int age;
public:
   hund(){ //= create
      cout<<"Hund wird gebaut"<<endl;
   }
   int lieb;
   void setage(int newage) {
      age=newage;
   }
   int getage() {
      return age;
   }
   void foo(hund dummy) //destroyer, braucht als parameter einen hund, der griegt den namen dummy
    {
      dummy.setage(-1); //geiles Alter nicht
    }
};

int main() {
  wauwau = new Hund();
}
Edit der compiler lässt mich garnicht erst starten, er sagt immer:
Zitat:

c:\dokumente und einstellungen\Benutzername\eigene dateien\visual studio 2008\projects\komm\komm\komm.cpp(165) : error C2065: 'wauwau': nichtdeklarierter Bezeichner

Olli 19. Jun 2008 18:53

Re: was ist in c++ der "->" Operator?
 
Code:
hund* wauwau = new hund();
Nachtrag: wuerde uebrigens immer direkte Pointer vermeiden, wenn es geht. Dafuer gibt es Container auf dem Stack ala boost::scoped_ptr ...
Nachtrag #2: Uebrigens benutzt boost::scoped_ptr auch einen ueberladenen operator->() und man kann damit putzige Sachen anstellen. Ich habe beispielsweise mal eine Wrapper-Templateklasse geschrieben die sich quasi um eine existierende (Legacy-)Klasse - welche immer mit Instanzpointern statt auf dem Stack benutzt wurde - herumlegte und bestimmte unsichere Dinge einfach verbot, andere aber ohne weiteres zuliess. Wie heisst es so schoen, wenn man ein Problem loesen will, erhoehe man einfach das Abstraktionslevel :)

DMW 20. Jun 2008 17:02

Re: was ist in c++ der "->" Operator?
 
Zitat:

Zitat von Olli
Ich habe beispielsweise mal eine Wrapper-Templateklasse geschrieben die sich quasi um eine existierende (Legacy-)Klasse - welche immer mit Instanzpointern statt auf dem Stack benutzt wurde - herumlegte und bestimmte unsichere Dinge einfach verbot, andere aber ohne weiteres zuliess. Wie heisst es so schoen, wenn man ein Problem loesen will, erhoehe man einfach das Abstraktionslevel :)

Sehr schön.
Auch all die Dinge, die man aufgrund der Operatorüberladung mit Iteratoren anstellen kann, seien hiermit zusammenfassend erwähnt ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz