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

1

12.08.2013, 13:35

C++ This Zeiger // Funktion von einer anderen Klasse aufrufen

Hallo Miteinander!
Ich versuche mich grade bei SDL und wollte als aller erstes mal einfach nur einen simplen Bildschirm ausgeben (Ich hoffe ich bin hier nicht falsch :whistling: ).
Wie auch immer. Leider scheitere ich schon bei dem Versuch und verzweifle langsam.
Um es kurz zu fassen: Ich will von der Klasse CGame die Renderfunktion von CLoad aufrufen. Mit dem This Zeiger. Leider wirft mir der Kompiler einige... viele Fehler hinterher und ich hab mich schon blödgegoogelt dabei.
Nunja.. Man sollte auch sagen, dass ich relativ neu und unerfahren bin und den Umgang mit einigen Sachen noch nicht wirklich drauf habe.
Es wäre also echt nice wenn sich jemand den Code angucken und mir sagen könnte was ich falsch, bzw besser hätte machen können :D
Ich hab alle cpp und hpp in eine .rar gepackt weil es zu lang und umständlich wäre es direkt hier zu posten ^^"
Vielen Dank schonmal im voraus. :thumbsup:
»Venrax« hat folgende Datei angehängt:
  • SDL Fail 1.rar (545,83 kB - 50 mal heruntergeladen - zuletzt: 12.05.2024, 20:13)

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

12.08.2013, 13:56

Hey,
poste bitte den Code direkt hier. Du musst nicht den ganzen Code posten sondern die Teile die wichtig sind. Den Teil der fehlschlägt und möglicherweise noch ein paar wichtige Dinge wie Klassendeklaration oder was so dazu gehört. In deinem Fall geht es vermutlich auch ohne. Es hört sich so an als hättest du this nicht verstanden. Mit this greifst du auf die eigene Instanz einer Klasse zu:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Test
{
private:
int value;

public:
void Test(int value)
{
    this->value = value;
}

int Get()
{
    return this->value; // kann in dem Fall auch return value; sein
}
};


Bei der Methode Get ist das this im Prinzip überflüssig. Beim Konstruktor nicht. Test hat einen Member namens value und der Parameter heißt value. Würdest du hier einfach value schrieben wird der Parameter benutzt. Willst du aber auf den Member zugreifen so musst du ein this davor schreiben. Dadurch signalisierst du dass es sich um einen Teil der Klasse handelt. Im Prinzip ist this einfach ein Zeiger auf die aktuelle Instanz der Klasse. Von außerhalb einer Klasse kannst du this also nicht benutzen. Was dir jetzt passiert sein kann:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
class Test
{
private:
int value;

public:
int DoSomething(int value);
};

int DoSomething(int value)
{
    return this->value + value; // Soll den Member der Klasse und den Parameter addieren und zurück geben.
}


Hier wurde allerdings eine freie Methode erstellt. DoSomething gehört nicht zur Klasse da etwas vergessen wurde:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
class Test
{
private:
int value;

public:
int DoSomething(int value);
};

int Test::DoSomething(int value) // Die Klasse muss mit angegeben werden
{
    return this->value + value; // Soll den Member der Klasse und den Parameter addieren und zurück geben.
}

Hier wurde die Methode der Klasse implementiert und keine neue erschaffen. This funktioniert also.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

3

13.08.2013, 19:22

Also so wie ich den Code sehe ist da was falsch.
In CGame in der while-Schleife erzeugst du CLevel jedes mal neu und löscht es. Am Ende löscht du es im Destruktor, also einmal zu viel, was dein RAM schädigt (nicht die Hardware, die Software).
In CLevel eig das gleiche.

Außerdem sind gegenseitige Referenzen nicht gut, du solltest CGame CLevel besitzen lassen und den Rest als Paramter übergeben.

4

13.08.2013, 20:37

So. Danke schonmal für die schnellen Antworten :'D
Also. Ich hab den Code im ganzen verpackt, weil ich ja nicht genau wusste was das Problem ist und es halt beim this Zeiger vermutet habe. Trotzdem war mir einiges Neu was du gesagt hast. Aber danke das nächste mal Poste ichs dann doch so ^^" hehe...
und birdfreeyahoo. Ja den Fehler hab ich auch bemerkt. Der hat sich wohl irgendwie eingeschlichen als ich in meiner Verzweiflung den Fehler gescuht habe*pfeif* Aber danke :D
"Außerdem sind gegenseitige Referenzen nicht gut, du solltest CGame CLevel besitzen lassen und den Rest als Paramter übergeben."
Ich weiß nicht genau was du da meinst. Könntest du mir das erläutern? :D Also wie sollen die sich gegenseitig besitzen.
Danke schonmal :)

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

5

13.08.2013, 20:42

Also du solltest in CGame nicht CLevel speichern und umgekehrt.
Nur einmal:
Also CGame speichert CLevel, aber NICHT umgekehrt.

6

13.08.2013, 20:52

Dude. Deine Aussage ist unglaublich Paradox xD
Sry ich weiß immer noch nicht ganz was du meinst :'D
So wie ich das jzz verstanden habe soll ich im Konstruktor von CGame nur EINMAL new CLevel machen.
Sry :p aber wie gesagt ich bin noch nicht so versiert hier :'D

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

7

13.08.2013, 22:09

In der Klasse von CGame kannst du ruhig einen Zeiger auf CLevel haben, aber dann in CLevel einen ZEiger auf CGame zu haben ist kein guter stil.

8

13.08.2013, 22:16

Ooouukey! Jzz hab ichs verstanden! Danke ich probiers mal so :)

9

13.08.2013, 22:33

Mit meiner Leserbrille bewaffnet hatte ich mich jzz wieder auf die Suche nach dem Problem begangen und wurde sogar fündig.
Zuallererst danke für die schnelle Antwort die auch sehr hilfreich waren :)
Ich hatte den Code umgeschrieben und hatte dabei bemerkt dass ich einfach allzuoft vergessen habe Werte zu geben.. *hust*
naja.. Der Übeltäter war dann wohl doch die Load Funktion von CLevel. Die hat nämlich kein Bild geladen, weshalb kein Objekt zurückgegeben wurde. Daraufhin hat das ganze Programm wild drauf losgespackt. Jzz muss ich mich nur noch darum kümmern aber das ist ne andere Sache :D
Vielen Dank euch allen! :thumbsup:

Werbeanzeige