Forum: PC-Programmierung this - Zeiger


von Devil (Gast)


Lesenswert?

Ich habe eine Klasse Auto erstellt.
In der Programmdatei möchte ich auf die Variablen und Methoden der 
Klasse zugreifen. Dazu habe ich zuerst ein Zeiger auf die Klasse 
erzeugt.
Nun möchte ich in dem Konstruktor den this Zeiger dem globalen Zeiger 
test übergeben. Stimmt meine Beschreibung?
1
Auto* test=NULL;  // Zeiger auf Klasse Auto
2
3
COM::COM() // Konstruktor
4
{
5
 .
6
 test = this; // this – Zeiger -> globalen Zeiger
7
 .
8
}

In der gleichen Programmdatei erxistiert noch eine Interruptroutine in 
der möchte ich auf die ganzen Variablen und Methoden zugreifen.
Und zwar mit dem Pfeil, Beispiel:

void interrupt(void)
{
 ...
 test->irgendeine_methode_von_klasse_auto;
 ...
 return;
}

Ich weiss nicht wie man dies exakt Beschreiben kann.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Naja, Dein Pointer sollte schon vom gleichen Typ sein wie die Klasse, 
die Du da verwendest. Du legst einen Pointer vom Typ "Auto" an, 
initialisierst ihn aber im Konstruktor einer Klasse COM mit dem 
this-Pointer eines Objektes.

Dann wiederum versuchst Du in Deiner Interruptroutine wiederum 
Memberfunktionen der Klasse Auto aufzurufen.

Angenommen, statt COM::COM stünde da Auto::Auto, dann würde das 
prinzipiell funktionieren (sofern denn wenigstens ein Objekt vom Typ 
Auto auch angelegt wird).

Jedoch wird Dein Pointer vom jeweils letzten Objekt des Typs Auto 
überschrieben; solltest Du ein solches Objekt als automatische Variable 
(also auf dem Stack) anlegen, dann zeigt Dein Pointer mit ziemlicher 
Sicherheit irgendwohin ins Nirvana.

Der ganze Aufriss ist aber gar nicht nötig, da Du den Zeiger auf ein 
Objekt auch völlig problemlos außerhalb des Objektes bestimmen kannst:
1
// Das isser, der Zeiger
2
Auto* pAuto = NULL;
3
4
// Hier haben wir eine Instanz der Klasse Auto
5
Auto MeinAuto;
6
7
// hier wird der Zeiger initialisiert
8
pAuto = &MeinAuto;
9
10
// und hier wird der Zeiger verwendet
11
if (pAuto)
12
  pAuto->Machwas();


Das hat den Vorteil, daß Du auch mehrere Objektinstanzen Deiner Klasse 
verwenden und auseinanderhalten kannst.

Wichtig ist, daß die Memberfunktion Machwas() als "public" deklariert 
ist, da sie sonst nicht außerhalb des Klassenkontextes aufgerufen werden 
darf.







von Devil (Gast)


Lesenswert?

Ich habe mich da vertan. Das von vorhin ist falsch.
Hier nochmals den Code:



Auto* test=NULL;  // Zeiger auf Klasse Auto

Auto::Auto() // Konstruktor
{
 ….
 test = this; // this – Zeiger -> globalen Zeiger
 ….
}


von Devil (Gast)


Lesenswert?

Was ist eigentlich genau der this Zeiger.
Ich möchte mein obiger Code zu Papier bringen. Ich weiss nicht wie ich 
was erklären kann.

von Devil (Gast)


Lesenswert?

Ich bin gerade am überlegen, was passiert wenn ich im Konstruktor dies 
hier nicht ausführe: test=this

Ist der this Zeiger ein zeiger auf die eigne Klasse?

von Wolfram (Gast)


Lesenswert?

Nein, auf die (eigene) Objektinstanz.

von Devil (Gast)


Lesenswert?

Also wie jetzt?!

Kann mir einer genau eklären wie der this - Zeiger in dem obigen 
Programm funktioniert?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Deine Fragen wurden bereits beantwortet.

Lies Dir mal die verschiedenen Beiträge durch.

Ansonsten rate ich Dir, Dir mal ein Grundlagenbuch über C++ 
durchzulesen. Der Stoustrup muss es dafür gar nicht mal sein.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Das können viele genau erklären:
http://www.onlinetutorials.de/cpp-index.htm

Grundsätzlich musst du dir den Unterschied zwischen Klasse und 
(Objekt)instanz klarmachen. Da hapert es bei dir.

Du kannst es so machen, wie du als erstes geschrieben hast. Das hat aber 
den Haken, dass du this erst bekommst, wenn du eine Methode deiner 
Klasse (korrekt der Instanz der Klasse) aufrufst. In dem Moment ist this 
der Zeiger auf die aktuelle Instanz. Wenn du in der Methode steckst, 
kannst this an test zuweisen.

Das Verfahren von Rufus ist wesentlich eleganter. In dem Moment wo du 
eine Instanz deiner Klasse anlegst, kannst du im nächsten Augenblick die 
Adresse davon holen (&) und dann damit deinen Zeiger auf die Instanz 
initialisieren. Du brauchst nicht erst eine Methode der frisch 
angelegten Instanz aufzurufen, um an this zu kommen.


von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> (...) Das hat aber den Haken, dass du this erst bekommst,
> wenn du eine Methode deiner Klasse (korrekt der Instanz
> der Klasse) aufrufst. In dem Moment ist this der Zeiger
> auf die aktuelle Instanz. Wenn du in der Methode steckst,
> kannst this an test zuweisen.

Nun, da die Zuweisung im Konstruktor abläuft, ist diesbezüglich kein 
Unterschied festzustellen. Der Konstruktor wird ja beim Anlegen einer 
Instanz automatisch aufgerufen.

Das ist nicht der wesentliche Unterschied "meiner" Vorgehensweise und 
der von "Devil" angedachten.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Stimmt, die Position im Konstruktor habe ich nicht beachtet.

Unelegant ist es dennoch. Bereits bei zwei Instanzen derselben Klasse 
wird es leicht fuddelisch. Hast du ja auch schon drauf hingewiesen.

"test" ist ja erstmal nur EIN globaler Zeiger auf eine Instanz der 
Klasse Auto. Den könnte man zwar ausserhalb des Konstruktors umkopieren 
- dann kann man aber auch gleich ausserhalb alle benötigten Zeiger 
anlegen.

von Karl H. (kbuchegg)


Lesenswert?

Rufus t. Firefly wrote:
>
> Das ist nicht der wesentliche Unterschied "meiner" Vorgehensweise und
> der von "Devil" angedachten.

Richtig.

Der wesentliche Unterschied liegt in der Sichtweise der Dinge.
Eine Klasse (ein Objekte einer Klasse) ist in erster Linie
sich selbst verpflichtet und kümmert sich um seine ureigensten
Belange. Was kümmert es den Konstruktor einer Klasse oder
generell ein Objekt einer Klasse, wenn es einen globalen
Zeiger auf dieses Objekt gibt? Richtig. Gar nichts. Das
geht das Objekt nichts an. Daher ist auch nicht zuständig
dafür, dass dieser Zeiger eingerichtet wird.

Teil des Erlernens der objektorientierten Sichtweise ist es,
Zuständigkeiten zu erkennen und konsequent durchzuziehen.
Ein Auto-Objekt ist nicht dafür zuständig einen externen
Pointer auf sich selbst einzurichten. Das ist die Aufgabe
dessen, der das Auto Objekt 'verwaltet'.
Beherzigt man diese Dinge nicht, dann arten objektorientierte
Programme, wenn sie größer werden, schnell in Chaos aus. Der
vermeintliche 'kurze Hack' erweist sich dann sehr oft als der
Bumerang.



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.