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

Powerpaule

Treue Seele

Beiträge: 162

Wohnort: Berlin

Beruf: Softwareentwickler

  • Private Nachricht senden

11

18.01.2012, 21:51

In Framework include ich Game.h und in Game.h ist nicht Framework.h included... geht auch nicht. Jetzt kann ich keinen Pointer cFramework* Framework mehr erstellen um in Game die Instanz zu speichern, weil es schlicht und ergreifend nicht definiert ist.
Dafür gibt es so genannte Vorwärtsdeklarationen - du kannst in einer Header-Datei sagen, dass es eine bestimmte Klasse gibt, ohne deren Header zu includen, und diese Klasse dann schon benutzen, solange du sie nur als Pointer benutzt (Pointer sind immer gleich groß, deshalb muss der Compiler den Typ nicht genau kennen, solange du nicht auf Memberfunktionen etc zugreifst).
Du kannst daher also beide Header nutzen ohne einen der anderen Header zu includen (Header in Headern includen ist eh immer eine schwierige Sache, weil eben genau das passieren kann was du schilderst):
(Framework.h)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
class Game;

class Framework {

private:
  Game* game;

};


Und in Game.h:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
 class Framework;
 
 class Game{
 
 private:
   Frame* framework;
 
 };
 


Und in den cpp-Dateien includest du dann alle header-Dateien (also in Framework.cpp includest du Framework.h und Game.h).

Allerdings hast du schon Recht, das ist Designtechnisch nicht sehr schön - es wäre besser, das Ganze nur in eine Richtung zu haben. Du schreibst, dass Framework Surfaces etc. verwaltet - muss denn dann Framework das Game kennen? Reicht es nicht, wenn das Game das Framework kennt, und sich dann da immer all die Sachen holt, die es braucht?
Nachher in der Main-Methode erstellst du einfach ein Framework Objekt, und dann ein Game-Objekt und übergibst diesem das Framework.

12

18.01.2012, 22:20

Hmm ne das würde nicht gehen denn letztendlich habe ich es so in etwa geplant:

Framework->Game->Spieler->Schuss (als Beispiel)

Und selbst der Schuss muss an Framework, Game und Spieler rankommen.
Das Problem ist halt, ich erstelle Game in Framework, Spieler in Game und Schuss in Spieler...
Ich muss auf Memberfunktionen etc. zugreifen wie man sieht.

Habe mir jetzt mal ein bisschen was zu Design-Patterns durchgelesen aber auch nichts gescheites gefunden.
Kennt vllt einer von euch dafür eine Lösung bzw ein Pattern?

Oder kann man das auch ganz anders Lösen und ich bin mit meiner Design Idee völlig auf dem Holzweg?

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

13

18.01.2012, 23:03

vielleicht ist dein Problem, dass du nicht wirklich weißt, welche Beziehungen zwischen den Klassen tatsächlich notwendig sind
so könnte ein Schuss so implementiert sein, dass er selbst nur die Informationen über sich speichert und an anderer Stelle die Logik ist (beispielsweise in Game o. ä.)

mach einfach mal ein Klassendiagramm, da diese wohl auch gut zu verstehen sein dürften (ohne viel Text)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

14

18.01.2012, 23:28

Habe bis gerade in Patterns gelesen und jetzt eins verstanden: Ich habe GARKEINE Ahnung wie ich ein Game richtig vom Aufbau her strukturiere und ja,

Zitat

vielleicht ist dein Problem, dass du nicht wirklich weißt, welche Beziehungen zwischen den Klassen tatsächlich notwendig sind
Stimmt auch. Ich bin quasi bei 0. Es ist doch schwerer als ich gedacht habe.
Gibt es da keine Tutorials oder irgendetwas in der Art? Sollte ich vllt nochmal ein neues Thema aufmachen im richtigen Bereich?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

15

19.01.2012, 00:58

Mach dir weniger Gedanken. Fang einfach mal an. Am besten lernst du aus deinen eigenen Fehlern. Setz es doch einfach mal so um wie du es oben geschildert hast. Das Problem beim Softwaredesign ist oft, dass es kein Patentrezept gibt(seltenst). Wenn du 5 Leute einen Entwurf machen lässt, wirst du vermutlich 5 verschiedene Designs kriegen. In erster Linie ist es wichtig, dass du mit dem Code klar kommst. Du sollst dich zurecht finden und den Überblick behalten. Ich finde vor allem am Anfang ist das erst mal das wichtigste. Dabei lernst du schon mal genug. Klar kann man sich dann auch Wissen von anderen dazu holen. Design Patterns sind eine schöne Sache, aber man muss sie mit Vorsicht genießen. Man wird schnell dazu hingerissen sein Design an das Pattern anzupassen und nicht umgekehrt. Natürlich steht erst mal die Software im Mittelpunkt und deswegen sollte man die Muster natürlich an die Software anpassen. Für das alles sollte man aber schon ein bisschen Erfahrung haben.
Wenn du schon ein paar kleine Projekte umgesetzt hast und dir dann die Patterns noch mal anguckst, dann erkennst du vielleicht darin Lösungen für Probleme, welche du mal hattest. Oder findest so schönere Lösungen. Ohne Erfahrung wird es aber schwer sein die richtigen Anwendungsfälle zu erkennen.
Aus Fehlern lernt man und von daher denke ich, du solltest einfach mal loslegen. Nur weil Sacaldur oder Powerpaule dein Design grad nicht mögen heisst das ja nichts;) Die beiden sind vermutlich schon länger als du dabei und haben schon ihre Erfahrungen gemacht. Vielleicht waren sie auch Naturtalente. Völlig egal. Sie haben dir ein paar Ratschläge gegeben. Denk einfach noch mal über alles nach und fang dann einfach an. Fragen kannst du dann immer noch;)
„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.“

16

19.01.2012, 01:59

Ok gut... Ich habe mir jetzt folgendes Prinzip überlegt. Bitte verzeit mir dass ich dafür jetzt kein Diagram mache:

Eine Klasse cContainer die cKlasseA und cKlasseB enthält.
Wenn ich jetzt in KlasseB auf KlasseA zugreifen möchte, muss ich nur noch eine Instanz von cContainer an cKlasseB übergeben.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// cContainer.h

#ifndef CONTAINER
#define CONTAINER

#include "KlasseA.h"
#include "KlasseB.h"

class cContainer
{
public:
    cKlasseA KlasseA;
    cKlasseB KlasseB;

    void Init();
};

void cContainer::Init()
{
    KlasseB.Init(this); // Hier wird die Instanz an cKlasseB übergeben
}

#endif


In cKlasseB

Quellcode

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
//cKlasseB.h
#ifndef KLASSEB
#define KLASSEB

class cContainer; // Vorwärtsdeklaration

class cKlasseB
{
private:
    cContainer* Container;
public:
    cKlasseB();
    ~cKlasseB();
    void Init(cContainer* p_cContainer);
};

cKlasseB::cKlasseB()
{
    Container = NULL;
}

cKlasseB::~cKlasseB()
{
    Container = NULL;
}

void cKlasseB::Init(cContainer* p_cContainer)
{
    Container = p_cContainer;
    int Zahl = Container->KlasseA.Zahl; // Hier will ich mir eine Zahl aus cKlasseA holen... ich will auch Memberfunktionen von cKlasseA nutzen können
}


Er meint halt: "Verwendung des undefinierten Typs cContainer".
Wie kann ich meine "Idee" umsetzen? Prinzipiell will ich einfach eine Baumstruktur z.b. Container->Game->Spieler etc. und einfach an jeder Stelle wo ich es brauche eine Instanz von Container übergeben.
Mein ganzes Problem würde sich lösen, wenn ich irgendwie cContainer in den einzelnen Unterklassen includen könnte...

EDIT: Eine andere Idee von mir war es irgendwo global einen cContainer Container* Pointer zu generieren und diesen dann halt global nutzen zu können... aber wie ich das anstelle weiß ich auch nicht, da ich ja nichts deklarieren kann an einer Stelle wo die Klasse selbst noch nicht included ist... oder geht das doch irgendwie?

EDIT2: Bin jetzt schon ein bisschen weiter, hab jetzt in den einzelnen Klassen A und B Container.h included und die Vorwärtsdeklaration in Container.h gemacht... ergibt dann aber: "verwendet undefiniertes KlasseB, KlasseA".

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Clark« (19.01.2012, 03:03)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

17

19.01.2012, 11:33

Lager die Implementierung in cpp-Dateien aus. Diese includieren dann den Header der Klasse, welche du verwenden möchtest. Allein durch class cKlasseB weiß der Compiler noch nicht welche Funktionen deine Klasse benötigt. Guck noch mal genau was Powerpaule geschrieben hat.
„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.“

Werbeanzeige