Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

09.07.2011, 18:15

Wie soll ich dann wissen wann ich das Teil einsetzen muss?
Außerdem möchte ich ihn jetzt lernen. Weil es echt schon so lange zurücklag.

EDIT: Die Spiele hab ich ja auch ohne gemacht, da würde ich in Zukunft wenig merken das ich ihn benötige.


MfG
Check

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Checkmateing« (09.07.2011, 18:23)


12

09.07.2011, 18:23


Mein Problem mit dem this-Zeiger hab ich echt höchst oberflächlich "beschrieben".
Ich verstehe nicht wozu ich das Teil brauche. Macht nicht

C-/C++-Quelltext

1
this->a = ab;
nicht das Gleiche wie

C-/C++-Quelltext

1
a = ab;
?

Prinzipiell ja, es kann jedoch sein, dass eine anderer Variable den gleichen Namen hat. Ein Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
void CShip::tuedas()
{
 // Diese beiden Zeilen machen dasselbe (wenn in der Klasse CShip ein Attribut namens a ist)
 cout << a;
 cout << this->a;

 int a = 10;
// Jetzt tuen diese beiden Zeilen nicht mehr dasselbt, weil die erste die lokale Variable a mit Wert 10 anspricht, während this->a das Attribut a meint.
cout << a;
cout << this->a;

}


Letztendlich kann man auch ohne this programmieren, wenn man darauf achtet, dass keine zwei Variablen denselben Namen haben, macht man das nicht kann this hier hilfreich.

Die anderen Anwendungszwecke von this sind etwas spezieller, wenn du soweit bist diese zu programmieren wirst du aber auch automatisch wissen wie es geht.

EDIT: Ein zweites Beispiel:
Du hast eine Klasse CShip und eine Klasse CWeapon. Die Klasse Ship erstellt eine Instanz von Weapon, aber damit die Klasse Weapon etwas abschießen kann muss sie aus irgendeinem Grund das Schiff kennen (z.B. um nach dem Namen zu fragen). Also muss die Klasse Ship der Weapon im Konstruktor sich selbst übergeben und zwar mit this.
Weapon:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
CWeapon(CShip theShip)
{
 ship = theShip;
}
void shoot()
{
 // Tue was.
 cout << ship->getName();
 // Tue noch was


Ship:

C-/C++-Quelltext

1
2
3
4
5
void createWeapon()
{
  Weapon* weapon = new CWeapon(this);
 weapon->shoot();
}

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »ComputerAddict« (09.07.2011, 18:29)


13

09.07.2011, 18:28

den this-zeiger "braucht" man nicht wirklich da der compiler an dem namen implizit in der regel sehr gut erkennt welche variable gemeint ist. es gibt situationen wo es sich nicht vermeiden lässt, this explizit hinzuschreiben, aber das sind dann fälle die sich vermeiden ließen wenn die variablen gescheit benannt wären. im konstruktor kommt sowas manchmal vor:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
class Point {
   int x, y;
public:
  Point(int x, int y);
  // ...
};

Point::Point(int x, int y) {
  this->x = x;
  this->y = y;
}


In diesem Fall ist ein einfaches x doppeldeutig. Das this-> sagt explizit dass einmal die Objektvariable gemeint ist. Ansonsten nimmt der Compiler immer das lokalste.
Btw würde ich hier Initialisierungslisten verwenden aber das ist ne andere Baustelle.

Pointer ersparen manchmal Arbeit, machen aber eigentlich immer dem Programmtext komplizierter (manche würden sagen "schöner"):

C-/C++-Quelltext

1
2
3
4
5
6
int arr[10];
int sum = 0;
for (unsigned int i=0; i<10; i++) sum += arr[i];
// ausgabe etc.
sum = 0;
for (int* p = arr[0]; p < arr[10]; ++p) sum += *p;


Bei der oberen Schleife mit normaler Zählvariable hast du für jeden Schleifendurchlauf
1* i inkrementieren
1* i mit 10 vergleichen
1* Adresse von arr + i berechnen
1* berechnete Adresse dereferenzieren um aktuelles Array-Element zu erhalten
1* aufaddieren
Bei der unteren Schleife hast du "nur":
1* p inkrementieren
1* p mit Ende des Arrays vergleichen
1* p dereferenzieren
1* aufaddieren

Insgesamt ist es also 1 Schritt weniger. Bei komplexeren Konstruktionen kann das auch mehr Arbeit einsparen. Allerdings kann man sich streiten ob das den Aufwand rechtfertigt, zumal der Compiler das selbst auch noch ganz gut optimiert.

//Ergänzung:
Prinzipiell kann man auch ohne Pointer programmieren wie ziemlich viele andere Programmiersprachen zeigen. Wie man ein Problem konkret löst hängt halt immer vom eigenen Geschmack ab. In einigen Fällen ermöglichen Pointer sehr elegante Lösungen. Wenn du schon etwas weiter bist wirst du vielleicht schon über Threads gestolpert sein. Je nach Art wie man einen Thread erzeugt gibt man ihm meistens einen Pointer auf die Funktion die er aufrufen soll und ein Pointer auf Daten die er der Funktion übergeben soll. Das macht die Sache sehr flexibel. Wollte man dies ohne Pointer bewerkstelligen bräuchte man einen Funktor für die Funktion und ein Objekt (beides z.B. per Referenz übergeben) welches die Daten kapselt. Das ist dann mehr Schreibarbeit, dafür aber streng objektorientiert (viele finden so ein Programmaufbau sauberer).

Gruß,

Dennis-.-

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dennis-.-« (09.07.2011, 18:37)


14

09.07.2011, 18:33

EDIT wegen Timefail: Danke Dennis-.-, das mit den Zeigern hat mir geholfen. Scheine ich doch einfach mehr Übung zu brauchen. :thumbsup:

Könnte mir trotzdem jemand die "Zweite Funktion" darlegen?

Also das blabla->blu();
Hat das "nur" den Nutzen, das eine Zeiger-Instanz in einer Klasse ist, die dann per this auf Funktionen der Anderen Klasse zugreifen kann?
Also mal als Pseudo:

C-/C++-Quelltext

1
#include "Klasse0.hpp"class Klasse1{ void MachIrgendwas();}class Klasse2{ void Funktion(); Klasse1 *m_pKlasse2;}void Klasse2::Funktion(){ m_pKlasse2=new Klasse1; m_pKlasse2->MachIrgendwas();}//Irgendwie weiter...

Wenn ja hab ich ihn doch verstanden und es fehlt echt Übung.
Würde denn dann einer eine Seite kennen, wo Aufgaben zu solchen/mehreren Themen sind? Wenn man das alleine macht, hat man ja die Lösung am Ende nicht. :lol:

Danke!

MfG
Check

EDIT: MAN! Wieso macht der die Zeilenumbrüche immer weg. ;(

15

09.07.2011, 18:35

In meinem obigen Post hab ich ein Beispiel reineditiert. Der sollte das eigentlich erklären.

16

09.07.2011, 18:37

Ja, dann hab ich es verstanden. Ich begebe mich dann mal in die Weiten von Google um mal Aufgaben zum Üben zu finden. :)

MfG
Check

17

09.07.2011, 18:40

EDIT: MAN! Wieso macht der die Zeilenumbrüche immer weg. ;(


Benutzt du den Editor oder den Quellcode-Tab? Wenn ersteren dann liegt es wohl daran.

18

09.07.2011, 19:00

Allso das Beste beispiel für this finde ich immer noch wenn du die ganze klasse zurückgeben willst.

C-/C++-Quelltext

1
2
3
4
5
6
7
class CItem
{
private:
    int Eigenschaft;
public:
    CItem Get_Item() {return this;}
};
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

19

09.07.2011, 19:11

Dieses Beispiel bringt so imo gar nichts. Eine aufrufende Klasse kann doch statt die Methode zu benutzen auch gleich so die Adresse vom Objekt abfragen. Wäre die Methode Get_Item() virtual und die Klasse von einer anderen abgeleitet würde es möglicherweise Sinn machen, das hängt jedoch vom Kontext ab.

20

09.07.2011, 19:21

Ja ersichtlich.

MfG
Check

Werbeanzeige