Du bist nicht angemeldet.

Werbeanzeige

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 667

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.
Software documentation is like sex. If it's good you want more, if it's bad it's better than nothing.

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: 516

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"

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?

7

30.09.2020, 23:48

Behoben :thumbsup:

Werbeanzeige