Frage zum this Zeiger
-
Hallo wofür is hier das new text ?
Die Instanz text existiert doch schon.
text *ptr_obj = new text;
Warum kann man text neu anlegen ?
Und was ist sinnvoller wenn man so auf die Klasse zugreift:
text obj;
obj.print_text("hallo obj");oder so ?
text *ptr; bzw. text *ptr=new text;
ptr->print_text("hallo ptr");#include <iostream> using namespace std; class text { public: void print_text ( char * ); }; void text :: print_text ( char *var ) { cout << var << endl; } int main() { text obj; text *ptr_obj = new text; text *ptr; ptr_obj->print_text("hallo ptr_obj"); ptr->print_text("hallo ptr "); obj.print_text("hallo obj"); system("PAUSE"); }
-
text ist hier keine Instanz eines Typs, sondern der Typ selbst...
-
this schrieb:
Hallo wofür is hier das new text ?
Die Instanz text existiert doch schon.
text *ptr_obj = new text;
text ist eine Klasse, kein Objekt einer Klasse (=Instanz). Da gibt's nichts zu existieren.
obj wäre hier eine Instanz von text. Und man kann natürlich auch mehr Instanzen haben. Und ptr_obj zeigt auf eine solche andere Instanz von text, welche hier mit new erzeugt wurde (anstatt wie bei obj automatisch).
Warum kann man text neu anlegen ?
Siehe oben.
Und was ist sinnvoller wenn man so auf die Klasse zugreift:
text obj;
obj.print_text("hallo obj");oder so ?
text *ptr; bzw. text *ptr=new text;
ptr->print_text("hallo ptr");Das kommt auf den Zusammenhang an, was man eben gerade braucht. Die letztere Variante ist jedoch eher unüblich, außer man macht spezielle Sachen mit Vererbung(Polymorphie) oder text wäre eine extrem umfangreiche (vom Speicherverbrauch her) Klasse (was in der Regel ein Designfehler wäre).
Ehrliche Empfehlung: Zieh dir ein Lehrbuch über Klassen und über Pointer rein. Dies ist absolutes Grundwissen, was dir fehlt. Klassen und Instanzen sind extrem wichtiges Wissen. Pointer kannste erstmal etwas ruhen lassen, weil man sie in C++ eher selten braucht. Wenn du sie aber brauchst (oder damit experimentieren möchtest), solltest du dich unbedingt erstmal kundig machen. Pointer sind übrigens alles wo -> oder * (außer als Multiplikation) vorkommt.
P.S.: Der Zugriff über den uninitialisierten Zeiger ptr wird in deinem Beispiel gündlich schiefgehen.
-
SeppJ hat recht...
ptr->print_text("bla");Ist keine gute Idee. Der Zeige ist nicht initialisiert, dass kann also nicht gut ausgehen. Lies Dir wirklich die Grundlagen an.
-
Was hat das jetzt mit
thiszu tun?
-
Ops hatte ich vergessen zu Initialisieren.

( Aber das Programm funktionierte ^^ )#include <iostream> using namespace std; class text { public: void print_text ( char * ); }; void text :: print_text ( char *var ) { cout << var << endl; } int main() { text *ptr=NULL; ptr->print_text("hallo ptr "); system("PAUSE"); }Also ist das hier: text *ptr_obj = new text;
Das selbe wie das: text *ptr;Ich hab schon mehrere Sachen über this Pointer gelesen aber es wird immer nur erklärt wie er angewandt wird.
Mich würde mal er interessieren wann man den this Zeiger Unbedingt braucht.
Ich hab mal darüber nachgedacht und dann diese Klasse geschrieben:
( In dem Kommentar hab ich mal geschrieben was ich mir vorstellen könnte wo ein this Zeiger Sinn macht wobei ich glaub meine Theorie ist falsch^^ Der this Zeiger ist bestimmt für andere Sachen sinnvoll. )
#include <iostream> using namespace std; class e_technik_reihenschaltung { public: void berechne_spannung( int , int ); void text_ausgabe ( char * ); }; void e_technik_reihenschaltung :: text_ausgabe ( char *var ) { cout << var << endl; } void e_technik_reihenschaltung :: berechne_spannung ( int Rg , int Ig ) { int Ug; Ug = Rg * Ig; cout << "Die Spannung betraegt: " << Ug << " Volt" << endl; } void calc_widerstand_und_stromstaerke ( int R1 , int R2 , int Ig ) { int Rg; Rg = R1+R2; e_technik_reihenschaltung *object; object -> berechne_spannung ( Rg , Ig ); } int main() { calc_widerstand_und_stromstaerke ( 4 , 2 , 3 ) ; // Über eine Funktion auf die Klasse e_technik_reihenschaltung zugreifen /*/ Über eine Funktion auf eine Klasse zuzugreifen kann sinnvoll sein wenn eine bestimmte Funktion z.b. etwas berechnen soll, und man diesen Wert gerne in seiner eigenen Klasse verwenden will. Dann muss man die Funktion nicht extra in die Klasse einbauen sondern man braucht nur noch ein Zeiger Objekt in der Funktion zu erstellen worüber dann per this Zeiger auf die Klasse zugegriffen werden kann. ( Wenn z.b. Person A eine Funktion erstellt hat, und Person B eine Klasse erstellt hat, und wenn Person B die Funktion von Person A nutzen will dann kann Person B das einfach mit dem this Zeiger erledigen. /*/ system("PAUSE"); }
-
( Aber das Programm funktionierte ^^ )
text *ptr=NULL; ptr->print_text("hallo ptr ");
Das funktioniert?Das sollte mindestens abstürzen. Darf aber auch gerne deine Festplatte formatieren und deine Katze schwängern.
Deine Ausführungen zum this-Zeiger verstehe ich nicht.
this ist ein Zeiger auf die aktuell aufrufende Instanz, wenn man eine Klassenmethode aufruft. Man braucht dies in der Regel eher selten, nämlich nur dann wenn man irgendeine Form von Selbstreferenz benötigt. Dies ist zum Beispiel oft der Fall, wenn eine Methode das aufrufende Objekt selbst zurückgeben soll (ein Beispiel wäre der Präinkrementoperator). Die zweite Anwendung ist die Auflösung von gewissen Doppeldeutigkeiten, aber das ist schon eher speziell.
-
SeppJ schrieb:
( Aber das Programm funktionierte ^^ )
text *ptr=NULL; ptr->print_text("hallo ptr ");
Das funktioniert?Das sollte mindestens abstürzen. Darf aber auch gerne deine Festplatte formatieren und deine Katze schwängern.
Genau so darf es funktionieren, was es wahrscheinlich auch tut, falls print_text keine Datenmember von text benutzt.
Siehe auch hier.
-
Das ist ist ja niedlich:
reinterpret_cast<foo*> (0)->bar ();

-
drakon schrieb:
Genau so darf es funktionieren, was es wahrscheinlich auch tut, falls print_text keine Datenmember von text benutzt.
Siehe auch hier.Aber der Standard sagt ziemlich unzweideutig, dass dieses Verhalten undefiniert ist:
5.5-4 schrieb:
If the dynamic type of the object does not contain the member to which the pointer refers, the behavior is undefined.
Ich konnte keine Ausnahme für static-Member finden.
Du hast aber Recht, dass dieses Konstrukt in der Praxis funktionieren wird.
P.S.:
Du schreibst doch selber bei deinem Artikel, dass das Verhalten undefiniert ist.
-
SeppJ schrieb:
drakon schrieb:
Genau so darf es funktionieren, was es wahrscheinlich auch tut, falls print_text keine Datenmember von text benutzt.
Siehe auch hier.Aber der Standard sagt ziemlich unzweideutig, dass dieses Verhalten undefiniert ist:
5.5-4 schrieb:
If the dynamic type of the object does not contain the member to which the pointer refers, the behavior is undefined.
Ich konnte keine Ausnahme für static-Member finden.
Du hast aber Recht, dass dieses Konstrukt in der Praxis funktionieren wird.
P.S.:
Du schreibst doch selber bei deinem Artikel, dass das Verhalten undefiniert ist.Jah.. Und darum darf es auch ohne Probleme funktionieren. Dass es das tut ist aber nicht garantiert. Undefiniert heisst nicht, dass auch wirklich etwas schlimmes passieren muss (oftmals ist das ja nicht nicht einmal der Fall). Das ist ja das Problem an dem undefiniertem Zeugs. Es stürtzt nicht ab und man bemerkt den Fehler möglicherweise sehr lange nicht bis man den Code mit einem anderen Compiler kompiliert und er da halt etwas anderes macht, als der letzte.
-
Aber wenn braucht man den UNBEDINGT den this Zeiger ?
Hat jemand dafür vielleicht ein EINFACHES Beispiel.
-
this schrieb:
Aber wenn braucht man den UNBEDINGT den this Zeiger ?
Hat jemand dafür vielleicht ein EINFACHES Beispiel.
void CMyClass::SetI(int i) { this->i=i; }Mann kann den Parameter natürlich auch anders nennen, aber egal. Hier sollte für dich ja ersichtlich sein, wieso der this-Zeiger nötig ist. Es gibt ein Klassenmember i und einen lokalen Parameter i in der Funktion. Will man innerhalb der Funktion auf das i der Klasse zugreifen, muss man das explizit per this-Zeiger sagen.
-
this schrieb:
Aber wenn braucht man den UNBEDINGT den this Zeiger ?
Hat jemand dafür vielleicht ein EINFACHES Beispiel.
container.push_back(this);
-
CMyClass& CMyClass::blubb (){ //... return *this; }Wird oft für die Ein/Ausgabeoperatoren benutzt.
-
Beim Operatoren Überladen kannst du den Einsatz von this auch beobachten:
http://magazin.c-plusplus.net/artikel/�berladung von Operatoren in CPlusPlus (Teil 1)