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

ugoessner

Frischling

  • »ugoessner« ist der Autor dieses Themas

Beiträge: 52

Wohnort: Wedemark OT-Mellendorf

Beruf: Systeminformatiker

  • Private Nachricht senden

1

07.01.2018, 19:09

Konstuktoraufrufe

Hallo Leute,

ich habe eine Basisklasse 'CSprite' mit überladenen Standardkonstruktor

C-/C++-Quelltext

1
CSprite::CSprite();

und eine Klasse 'CPlayer' mit zwei Konstruktoren.

C-/C++-Quelltext

1
2
CPlayer::CPlayer();
CPlayer::CPlayer(sf::Vector2f);
Die Klasse CPlayer ist deklariert als

C-/C++-Quelltext

1
class CPlayer : public CSprite


In der Klasse 'CGame' lasse ich einen CPlayer erzeugen.

C-/C++-Quelltext

1
2
3
4
5
CPlayer *Player;
void CGame::Init()
{
    this->Player=new CPlayer(sf::Vector2f(500, 200));
}


Da wird doch der Konstruktor von der Klasse 'CPlayer' aufgerufen aber wird dann auch der Konstruktor von der Klasse 'CSprite' aufgerufen?
Ich hätte sonst ein richtiges Problem.

Sicherheitshalber habe ich den Konstruktoraufruf von CSprite in der CPlayer-Konstuktorinitialisierung hingesetzt.

C-/C++-Quelltext

1
2
CPlayer::CPlayer() : CSprite()
CPlayer::CPlayer(sf::Vector2f pos) : CSprite()


Einen schönen Dank schon mal.
#define __miniMAL 0x00

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

07.01.2018, 20:08

Also mal ganz langsam...
- Ein Spieler ist kein Sprite. Die Vererbung gehört nicht dahin.
- Eine Init-Methode is völliger Käse, denn dafür gibt es den Konstruktor
- Player sollte in CGame doch sicher kein Pointer sein!?
- Wie in den Grundlagen über Vererbung nachlesbar, wird ein Konstruktor der Basis-Klasse immer vor dem Konstruktor der abgeleiteten Klasse aufgerufen. Im Fall eines Standard-Konstruktors erfolgt das transparent, ansonsten musst du explizit den Basis-Konstruktor angeben, den du brauchst

PS: Wozu brauchst du eine Klasse CSprite, wenn du sowieso mit SFML arbeitest? Da gibt es sf::Sprite.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

ugoessner

Frischling

  • »ugoessner« ist der Autor dieses Themas

Beiträge: 52

Wohnort: Wedemark OT-Mellendorf

Beruf: Systeminformatiker

  • Private Nachricht senden

3

07.01.2018, 20:45

In der Klasse 'CSprite' habe ich zwei Render-Methoden:

C-/C++-Quelltext

1
2
void CSprite::Render(sf::Vector2f);
void CSprite::Render(sf::IntRect, sf::Vector2f);
Ich müsste dann solche Funktionen in der Klasse 'CPlayer' nochmal implementieren um dann eine der beiden Render-Funktionen von CSprite aufzurufen und das ist mir dann doch ein bisschen zu viel overhead.

PS: Wozu brauchst du eine Klasse CSprite, wenn du sowieso mit SFML arbeitest? Da gibt es sf::Sprite.
Ich möchte eine Klasse haben, die sich um das Laden und Rendern der Sprite kümmert.
#define __miniMAL 0x00

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

07.01.2018, 22:26

Ich müsste dann solche Funktionen in der Klasse 'CPlayer' nochmal implementieren um dann eine der beiden Render-Funktionen von CSprite aufzurufen und das ist mir dann doch ein bisschen zu viel overhead.
Nope, müsstest du nicht. Weil das Sprite da gerendert wird, wo der Player ist. Und diese Information steckt bereits in der Player-Klasse oder sollte da stecken. Damit ist es absolut nicht notwendig eine Positionn von außen hinein zu geben.

Ich möchte eine Klasse haben, die sich um das Laden und Rendern der Sprite kümmert.
Schlechte Idee. Problem dabei wäre nämlich, dass falls du ein Sprite mehrfach verwenden willst, auch das Bild mehrfach geladen werden muss. Das dauert nicht nur lange, sondern kostet auch unnötig viel Speicher. Finde lieber eine andere Lösung.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige