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

Timmyew

Treue Seele

  • »Timmyew« ist der Autor dieses Themas

Beiträge: 128

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

1

29.09.2020, 17:56

C++ Include und Konventionen

Guten Tag,

heute präsentiere ich euch keinen Fehler, sondern frage die liebe Community wie ihr
eure Programme strukturiert, hinsichtlich der Include Präprozessor Direktive.

-Wie strukturiert man ein Programm ohne das Zirkuläre Referenzen entstehen?
-Habe ich überhaupt die Möglichkeit in C++ Klassen gegenseitig in den Includes einzubinden?

-Mein Ziel ist es eine TextureManager Klasse zu schreiben die zwei Statische Funktionen enthält.
-SDL_Texture* LoadTexture(const* char filename)
-void Draw()

Um diese Klasse zu realisieren, muss ich die Game-Klasse einbinden. Allerdings enthält Game die Klasse Player.
Player wiederum enthält wieder die eingebundene Klasse von TextureManager. TextureManager enthält den SDL_Renderer von Game.
Wenn ich das Programm jetzt kompilieren würde, würde es bedenkenlos funktionieren oder kommt es dann zu Fehlern?

Gruß,
Timmyew.

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

2

29.09.2020, 18:29

Das Stichwort dürfte "Single Responsibility" sein.
Wozu braucht die Verwaltung von Texturen ein Spiel? Warum muss der Spieler selber Texturen verwalten?

Außerdem ist es ziemlich hilfreich, wenn man nur interfaces durch die Gegend reicht. Dann hast du auch nur die Teile, die du wirklich brauchst als Abhängigkeiten.

3

30.09.2020, 10:10

Habe ich überhaupt die Möglichkeit in C++ Klassen gegenseitig in den Includes einzubinden?


Ja, die hast du. Du kannst Klassen vorab schon mal deklarieren:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// A.hpp
#pragma once

class B; // <- forward declaration

class A
{
  void do_something_specific_with_b();

  B* b;
  int x;
};

// B.hpp
#pragma once

class A;

class B
{
  void do_something_specific_with_a();

  A* a;
  int y;
};

// A.cpp
#include <A.hpp>
#include <B.hpp>

void A::do_something_specific_with_b()
{
  b->y += 42;
}

// B.cpp
#include <B.hpp>
#include <A.hpp>

void B::do_something_specific_with_a()
{
  a->x += 1337;
}


MfG
Check

Thoran

Alter Hase

Beiträge: 520

Wohnort: Stuttgart

Beruf: Senior Software Engineer

  • Private Nachricht senden

4

30.09.2020, 14:59

Zirkulare Abhängigkeiten sind immer ein Indiz für ein schlecht durchdachtes Design und lassen sich immer auflösen ohne dass man dafür forward-Deklarationen benötigt. In deinem Fall stellt sich z.b. die Frage warum ein TexturManager zeichnen kann? Sollte er nicht einfach Texturen laden, deren Lebensdauer verwalten und auf Anfrage Referenzen zur Verfügung stellen? Genauso stellt sich die Frage warum der TexturMAnager das Spiel kennen muss? Sylence hat ein gutes Stichwort genannt, mit dem sich zirkulare Abhängigkeiten verhindern lassen, "Single Responsibility". Wenn du dir das zu Herzen nimmst, solltest du nicht in zirkulare Abhängigkeiten laufen.
Mein Entwicklertagebuch
Aktuelles Projekt: Universum Espionage
Eingestellt:Spieleengine SilverCore
Organisator "Spieleentwickler Stammtisch Stuttgart"

Timmyew

Treue Seele

  • »Timmyew« ist der Autor dieses Themas

Beiträge: 128

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

5

30.09.2020, 17:03

Ja ich muss zugeben ich habe die Situation falsch dargestellt.

Es geht vielmehr darum, dass ich das ECS (Entity Component System) verwende und dadurch die Möglichkeit bekomme
für ein Entity mehrere Komponenten zuzuweisen. ComponentePosition, ComponenteKI, ComponenteSprites, ComponentDraw usw...
Diese Komponenten erben alle von der Component Klasse. Die Componenten-Klasse enthält Funktionen, wie "Update", "Init" und so weiter.
Durch diese Logik erspare ich mir eine Menge an Schreibarbeit und sorge dafür, dass mein Code eine sehr gute Strukturierung aufweist.
Ich weiß die Herangehensweise ist momentan noch schlecht, aber das liegt vielmehr daran, dass ich mir eine Englische Tutorial-Reihe über die
Spieleprogrammierung mit SDL anschaue. Da geht der Videoersteller dann Schritt für Schritt mit einem die Logik durch. Im Späterem Verlauf optimiert dieser
diese Logik und zeigt einem damit was für eine Power das ECS hat.

Link zum Video:
https://www.youtube.com/watch?v=YrWQsuDT…art_radio=1&t=1

6

30.09.2020, 21:05

Hast du denn noch eine Frage oder ist das Problem behoben?

Timmyew

Treue Seele

  • »Timmyew« ist der Autor dieses Themas

Beiträge: 128

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

7

30.09.2020, 23:48

Behoben :thumbsup:

Werbeanzeige