 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Sören JLI Master Trainee

Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 17.11.2002, 19:42 Titel: Zeiger auf eigenes Objekt? |
|
|
Hi,
ich habe folgendes Problem: Ich will das eine Klasse per Funktion einen Zeiger auf sich selbst zurück gibt! Wie soll ich das machen, ich habe schonmal von einen this-Zeiger gehört, weiss allerdings nicht was es mit diesem auf sich hat!
Danke Im Vorraus!
MiracleBoy |
|
Nach oben |
|
 |
VerruecktesHuhn Super JLI'ler

Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 17.11.2002, 19:47 Titel: |
|
|
Der this Zeiger ist ein Zeiger auf die eigene Klasse. Also wenn du ne Methode in der Klasse hast, die auf Attribute der Klasse der Methode zugreifen soll, kannst du den this Zeiger verwenden.
Versuch mal das aus
weiß aber nicht obs klappt...
Cu,
VH |
|
Nach oben |
|
 |
AFE-GmdG JLI MVP


Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 18.11.2002, 16:28 Titel: |
|
|
Das funktioniert schon, aber der This-Zeiger ist nur solange gültig, wie die Instanz der Klasse besteht - also wenn man z.B. ein Objekt der Klasse anlegt. Allerdings ist das Objekt selbst auch schon der this-Zeiger...
AFE-GmdG _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
 |
VerruecktesHuhn Super JLI'ler

Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 18.11.2002, 18:50 Titel: |
|
|
Könntest du nochmal genauer ausdrücken was du meinst... |
|
Nach oben |
|
 |
AFE-GmdG JLI MVP


Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 18.11.2002, 19:04 Titel: |
|
|
Code: |
class TestClass {
public:
TestClass();
virtual ~TestClass();
TestClass *GetKlassenZeiger() { return this; };
};
TestClass *MeineKlasse; // Objekt, aber ungültig.
MeineKlasse=new TestClass(); // Objekt, gültig.
MeineKlasse->GetKlassenZeiger(); // Gibt den gleichen Wert zurück, der auch in MeineKlasse steht - es ist ein Zeiger auf DIESE Instanz der Klasse.
// Es sollte auch folgendes nun Klappen:
MeineKlasse->GetKlassenZeiger()->GetKlassenZeiger()->GetKlassenZeiger(); // Ist in diesem Beispiel zwar unsinnig, aber Syntaktisch richtig.
delete MeineKlasse; // Zerstört die Instanz von TestClass, MeineKlasse ist nun ungültig.
MeineKlasse->GetKlassenZeiger(); // Fehler - MeineKlasse ist ja nicht mehr gültig.
TestClass::GetKlassenZeiger(); // Gibt zwar einen Zeiger zurück, der aber im Moment, da er gespeichert wird schon wieder ungültig ist, da kein Objekt angelegt wurde.
|
Berichtigt mich, wenn ich Unsinn erzähle, aber meines erachtens sollte es so stimmen...
AFE-GmdG _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
Zuletzt bearbeitet von AFE-GmdG am 18.11.2002, 19:12, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
 |
VerruecktesHuhn Super JLI'ler

Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 18.11.2002, 19:09 Titel: |
|
|
So sollte es aber immer möglich sein...
Code: |
TestClass MeineKlasse;
MeineKlasse->GetKlassenZeiger();
|
... oder? |
|
Nach oben |
|
 |
AFE-GmdG JLI MVP


Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 18.11.2002, 19:15 Titel: |
|
|
Nicht ganz: MeineKlasse ist hier eine Variable, kein Ziger. Daher muß es folgendermaßen aussehen:
Code: |
TestClass MeineKlasse;
MeineKlasse.GetKlassenZeiger(); // . statt -> !!!
|
AFE-GmdG _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
 |
VerruecktesHuhn Super JLI'ler

Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 18.11.2002, 19:18 Titel: |
|
|
Ich habs einfach von deinem Post rauskopiert und nicht drauf geachtet bin halt zu faul...
Cu,
VH |
|
Nach oben |
|
 |
Jörg JLI MVP


Anmeldedatum: 19.07.2002 Beiträge: 182 Wohnort: Siegen/NRW Medaillen: Keine
|
Verfasst am: 18.11.2002, 19:32 Titel: |
|
|
AFE-GmdG hat Folgendes geschrieben: | Code: |
TestClass::GetKlassenZeiger(); // Gibt zwar einen Zeiger zurück, der aber im Moment, da er gespeichert wird schon wieder ungültig ist, da kein Objekt angelegt wurde.
|
|
Das funktioniert nicht (Compilerfehler), denn GetKlassenZeiger() ist nicht statisch. Wäre sie statisch würde es jedoch auch nicht funktionieren weil statische Funktionen ja keine Instanz haben, auf die this Zeigen könnte.
Soviel ich weiß übergibt C++ den this-Zeiger heimlich als letzten Parameter in Memberfunktionen, bei statischen Funktionen wird this nicht übergeben (aus o.g. Gründen). _________________ www.messiahzone.de.vu |
|
Nach oben |
|
 |
AFE-GmdG JLI MVP


Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 19.11.2002, 07:50 Titel: |
|
|
Leuchetet ein. Ob der Compiler den this-Zeiger als ersten oder als letzten Parameter übergibt ist implementationsabhängig und wird meines erachtens nirgends im Standard erwähnt. Als Beispiel für die Kurzlebigkeit von this-Zeigern jedoch reichte der zugegebenermaßen falsche Codeschnipsel aber aus, da er so eh nie verwendet werden könnte.
AFE-GmdG _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
 |
Sören JLI Master Trainee

Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 19.11.2002, 13:52 Titel: |
|
|
Danke! Also geht es nicht so ganz wie ich es wollte!?
Vielleicht hilft euch das weiter wenn ich mein Problem erläutere: Für die Kollisiionserkennung in einem kleinen Spiel von mir habe ich vor ein statisches Member-Array anzulegen, in dem sich eben alle Klassen mit Zeiger eintragen, damit ich so die Kollisionen intern in der Sprite Klasse testen kann!
Wenn jemnad eine andere/bessere Idee hat kann er sie gerne nennen! |
|
Nach oben |
|
 |
VerruecktesHuhn Super JLI'ler

Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 19.11.2002, 14:14 Titel: |
|
|
Müsste doch so gehen:
Code: |
TestClass* PointerArray[NUMBEROFELEMENTS];
TestClass Klasse;
PointerArray[0] = &Klasse;
|
Oder irre ich mich da? |
|
Nach oben |
|
 |
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 19.11.2002, 16:39 Titel: |
|
|
mach es doch so, dass es eine dynamische liste oder ein statisches array gibt, in denen alle gegner gespeichert sind und jeder gegner hat einen (also statischen) zeiger auf die liste oder das array.
kommt zwar dasselbe bei heraus allerdings hast du dann die liste nicht in der gegner klasse drinn sondern als eigenes objekt. |
|
Nach oben |
|
 |
Sören JLI Master Trainee

Anmeldedatum: 26.07.2002 Beiträge: 647 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 20.11.2002, 13:07 Titel: |
|
|
Ja, so muss ich es wohl machen! Mit dem Array in der KLasse, erschien es mir noch etwas praktischer, aber es geht nunmal nicht!
Danke nochmal @all! |
|
Nach oben |
|
 |
Hazel JLI MVP


Alter: 40 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 20.11.2002, 13:22 Titel: |
|
|
Du kannsts auch so machen:
Code: |
class CBase
{
public:
CBase();
~CBase();
// bla bla bla
private:
static CBase * m_pActors[MAXACTORS]; // oder eine Liste oder was auch immer
};
|
_________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|