wake-up-neo.com

C++ - Klassenobjektzeiger und Zugriff auf Memberfunktionen

Ich bin ein bisschen neu in C++ und versuche, Dinge mit Qt zu bearbeiten und bin auf diese verwirrende Sache gestoßen:

Die Konzepte in verschiedenen Tutorials besagen Folgendes:

Class *obj;

*obj - zeigt den Wert des Objekts an, das im referenzierten Speicher gespeichert ist
obj - wird die Adresse des Speichers sein, auf den sie zeigt

also würde ich sowas machen

*obj=new Class();

wenn ich jedoch auf eine Funktion zugreifen möchte, muss ich obj->function1(); anstelle von *obj->function1(); ausführen.

- nicht sicher warum, da mit normalen Objekten [normalObj.function1();] funktionieren würde, da dies der Wert direkt ist.

Warum verwenden wir also für Zeigerobjekte eine Speicherreferenz, um auf die Funktion zuzugreifen, Oder ist es bei normalen Objekten auch, dass sie immer referenziert

P .: Kann mir jemand eine gute Anleitung für die Verwendung von Zeigern in C++ geben, damit meine Anfragen wie diese direkt darin behandelt werden können.

12
rock_win

Das *-Symbol wird zum Definieren eines Zeigers und zum Dereferenzieren eines Zeigers verwendet. Wenn ich zum Beispiel einen Zeiger auf ein int erstellen wollte, könnte ich folgendes tun:

int *ptr;

In diesem Beispiel wird der * verwendet, um anzugeben, dass dies ein Zeiger auf einen int ist. Wenn Sie jetzt keinen Zeiger deklarieren und das *-Symbol mit einem bereits deklarierten Zeiger verwenden, wird dereferenziert. Wie Sie wahrscheinlich wissen, ist ein Zeiger einfach eine Adresse. Wenn Sie einen Zeiger dereferenzieren, erhalten Sie den Wert, auf den diese Adresse zeigt. Zum Beispiel:

int pointToMe = 5;
int *ptr = &pointToMe;
std::cout << *ptr;

Dies wird ausgedruckt 5. Wenn Sie einer neuen Adresse einen Zeiger zuweisen und nicht in der Deklaration enthalten, verwenden Sie not das *-Symbol. So:

int pointToMe = 5;
int *ptr;
ptr = &pointToMe;

so würden Sie es tun. Sie können den Zeiger auch festlegen, um dem Wert, auf den die Adresse zeigt, einen neuen Wert zuzuweisen. Sowie:

int pointToMe = 5;
int *ptr = &pointToMe;
std::cout << *ptr; // Prints out 5
*ptr = 27;
std::cout << *ptr; // Prints out 27

Nun wirkt -> wie das Verteidigungssymbol. Dereferenziert den Zeiger und verwendet dann die Elementfunktionen und -variablen so, als hätten Sie . mit einem Nichtzeigerobjekt verwendet. Selbst bei einem Objekt, das kein Zeiger ist, können Sie den -> verwenden, indem Sie zunächst die Adresse abrufen:

CObj object;
(&object)->MemberFunction();

Das ist nur ein kurzer Überblick über Zeiger, ich hoffe es hilft.

27
Yokatta24

Eigentlich bist du falsch. Sie machen:

obj=new Class();

oder

Class *obj = new Class;

welche völlig unterschiedlich sind.

Class *obj;
*obj = new Class;

würde nicht kompilieren.

obj ist vom Typ Class*, das ist also das, was Sie ihm zuweisen können (und was new Class zurückgibt).

3
Luchian Grigore

Sie können den "normalen" . verwenden, um auf die Objektmitglieder zuzugreifen, aber Sie müssen zuerst den Zeiger dereferenzieren.

Aufgrund der Vorrangigkeit des Bedieners sieht dies wie (*obj).member aus. Für diejenigen, die denken, dass dies zu viel zum Schreiben ist, ist obj->member eine kürzere Alternative.

Wenn Sie ein Objekt c vom Typ Class haben, bedeutet *c.ptr, dass Sie einen Zeiger ptr dereferenzieren, der ein Mitglied von Class ist. Das ist ein Grund für (*obj).member, was etwas anderes bedeutet.

3
Bo Persson

Genauer können Sie dies tun 

Class  obj;
Class* obj_ptr;

obj_ptr = &obj;

// Now onwards you can use the pointer to access data members and function

obj_ptr->a = 10; // Like this
1
Vikas Rao