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

Asbestbrezel

Frischling

  • »Asbestbrezel« ist der Autor dieses Themas

Beiträge: 41

Wohnort: Solingen

  • Private Nachricht senden

1

03.12.2013, 01:09

[C++] SFML RenderWindow per Referenz übergeben.

Hallo zusammen,

ja, ich will das in der CGame auf dem Heap erstellte RenderWindow an meine Player-Klasse weitergeben. Es will aber einfach nicht klappen.

definition in der CGame.hpp

Quellcode

1
sf::RenderWindow            *m_pWindow;


Instalation im Konstruktor der CGame-Klasse

Quellcode

1
m_pWindow= new sf::RenderWindow(sf::VideoMode(1200, 900), "test", sf::Style::Close);

Aufruf der Renderfunktion in der CGame.cpp

Quellcode

1
mPlayer.render(&m_pWindow);


Definition der Renderfunktion in der CPlayer.hpp

Quellcode

1
void render (sf::RenderWindow *m_pWindow);


dass spuckt der compiler aus:

Quellcode

1
2
3
4
5
6
7
8
9
CGame.cpp: In Elementfunktion »void CGame::render()«:
CGame.cpp:72:27: Fehler: keine passende Funktion für Aufruf von »CPlayer::render(sf::RenderWindow**)«
  mPlayer.render(&m_pWindow);
                        ^
CGame.cpp:72:27: Anmerkung: Kandidat ist:
In file included from CGame.hpp:5:0,
                from CGame.cpp:1:
CPlayer.hpp:11:8: Anmerkung: void CPlayer::render(sf::RenderWindow*)
   void render (sf::RenderWindow *m_pWindow);


Was mach ich da falsch? ?(
Bei diesen Möglichkeiten wie man diese Token setzen kann und wo genau, blick ich leider immer noch nicht durch.

Danke

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

03.12.2013, 01:35

Du hast einen Zeiger auf einen Zeiger übergeben.
m_pWindow ist der Zeiger. Den willst du übergeben. &m_pWindow ist ein Zeiger auf den Zeiger.

Asbestbrezel

Frischling

  • »Asbestbrezel« ist der Autor dieses Themas

Beiträge: 41

Wohnort: Solingen

  • Private Nachricht senden

3

03.12.2013, 01:42

boah, ich fass es nicht, es klappt. und das obwohl ich da seit ner stunde dran rumprobiere.

naja, danke jedenfalls :)

4

03.12.2013, 07:51

Gibt es einen besonderen Grund, warum Du hier einen rohen Zeiger verwenden willst und nicht ein reguläres Objekt?

Zitat

Ich bin nicht der Messias.
Ich sage, du bist es, Herr. Und ich muss es wissen, denn ich bin schon einigen gefolgt.

https://bitbucket.org/bwbg

Asbestbrezel

Frischling

  • »Asbestbrezel« ist der Autor dieses Themas

Beiträge: 41

Wohnort: Solingen

  • Private Nachricht senden

5

03.12.2013, 11:22

@bwbg:Also du meinst so:

Zitat

definition in der CGame.hpp

Quellcode

1
sf::RenderWindow m_pWindow;


Instalation im Konstruktor der CGame-Klasse

Quellcode

1
m_pWindow.Create(sf::VideoMode(1200, 900), "test", sf::Style::Close);


Aufruf der Renderfunktion in der CGame.cpp

Quellcode

1
mPlayer.render(&m_pWindow);


Definition der Renderfunktion in der CPlayer.hpp

Quellcode

1
void render (sf::RenderWindow *m_pWindow);

Das funktioniert tatsächlich auch. Aber warum sollte letzteres besser sein?
Sorry, aber ich bin bei der Auswahl, ob Zeiger, Referenz oder fester Wert das Passende ist, noch ziemlich unsicher.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

03.12.2013, 11:28

In C++ sind Referenzen gegenüber Zeigern vorzuziehen, wenn ansonsten beide gleich gut geeignet wären.

7

03.12.2013, 11:50

Die Signatur der Renderfunktion in der Klasse Player sollte demnach auch eine Referenz statt dem Zeiger erwarten und zudem const sein -> ich gehe davon aus, dass das Rendern den Zustand eines Player-Objektes nicht verändert:

C-/C++-Quelltext

1
void render(sf::RenderWindow&) const;


Leicht OT: Die ganzen Präfixe lesen sich nicht sonderlich leicht. Du darfst getrost drauf verzichten. Als Ausnahme sähe ich lediglich das Attributpräfix "m_". Wobei ich persönlich ein "_" als Suffix nehme.

Zitat

Ich bin nicht der Messias.
Ich sage, du bist es, Herr. Und ich muss es wissen, denn ich bin schon einigen gefolgt.

https://bitbucket.org/bwbg

Asbestbrezel

Frischling

  • »Asbestbrezel« ist der Autor dieses Themas

Beiträge: 41

Wohnort: Solingen

  • Private Nachricht senden

8

03.12.2013, 19:09

mhm, ok, ich hab jetzt diese deine 3. Variante eingebaut. Es funktioniert, also lass ich das auch so ^^

Jetzt hab ich mal g++ mit der option -Wall gestartet. Und es gibt noch ein paar Warnungen aus, deren Bedeutung mir nicht ganz klar ist. Vielleicht weiß jemand rat.

Quellcode

1
2
3
4
5
6
7
8
9
10
In file included from CGame.cpp:1:0:
CGame.hpp: In Konstruktor »CGame::CGame()«:
CGame.hpp:27:22: Warnung: »CGame::m_pWindow« wird initialisiert nach [-Wreorder]
   sf::RenderWindow   m_pWindow;
                    ^
CGame.hpp:23:15: Warnung:   »CPlayer CGame::mPlayer« [-Wreorder]
   CPlayer  mPlayer;
            ^
CGame.cpp:6:1: Warnung:   während es hier initialisiert wurde [-Wreorder]
 CGame::CGame()

9

03.12.2013, 19:22

Dies ist eine Warnung des gcc, dass du deine Variablen in deiner Initialisierungsliste in einer anderen Reihenfolge angegeben hast als im Header. Dies kann zu Problemen führen, da immer die Reihenfolge im Header ausschlaggebend ist.

Wenn du Beispiele willst, schau auf stackoverflow.
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

Asbestbrezel

Frischling

  • »Asbestbrezel« ist der Autor dieses Themas

Beiträge: 41

Wohnort: Solingen

  • Private Nachricht senden

10

03.12.2013, 19:39

ah, sie sind verschwunden, sehr gut.

danke nochmals für all die schnellen antworten

Werbeanzeige