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

1

01.03.2015, 14:57

[C++] Include Problem

Gudden Tach, ich bins schon wieder :crazy:

Ich habe leider ein neues Problem. Diesmal handelt es sich, wie die Überschrift schon besagt, um ein Include Problem.

Da ich mich doch dazu entschlossen habe ein kleines Menü einzubauen, muss ich nun ein wening Code hin & her schieben.
Meine Framework Klasse soll nun auf die Game Klasse zugreifen können.
Wenn ich jedoch #include "Game.hpp" in die Header-Datei der Framework Klasse schreibe gibts riesen krach vom Compiler.
97 Fehler...
Weiterhin ist zu sagen das die Klasse Framework und die Game Klasse Singetons sind. Und ich benutze schon #pragma once

Die Include Reihenfolge des Frameworks:

C-/C++-Quelltext

1
2
3
4
#include "TSingleton.hpp"
#include "Timer.hpp" // -> Singleton
#include "Game.hpp" // -> Singleton
#include <SDL_ttf.h>


Die Include Reihenfolge des Games:

C-/C++-Quelltext

1
2
3
4
5
#include "TSingleton.hpp"
#include "PlayerLeft.hpp"
#include "PlayerRight.hpp"
#include "Sprite.hpp"
#include "Ball.hpp"


Im Internet habe ich nichts brauchbares gefunden außer ein paar Stichwörter wie Include-Wächter oder Ring-Include.
den Include Wächter benutze ich doch schon durch #pragma once oder ist das falsch?

für Ring-Include:
Im Anhang befindet sicht noch ein Bider der Code Map die ich mit VS gemacht habe und eine Txt Datei mit den Fehlern
in der Code-Map kann ich jedoch nichts ausergewöhnliches erkennen.

Was sind den Grundsätzliche fehler die ich beim Includen begehen kann?

ich hoffe ihr könnt mir auch diesmal helfen =)

mfg Urprimat
»Urprimat« hat folgende Bilder angehängt:
  • Include.PNG
  • Include.PNG
»Urprimat« hat folgende Datei angehängt:
  • Fehler.txt (16,89 kB - 130 mal heruntergeladen - zuletzt: 10.03.2024, 06:22)
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.

Linus Torvalds

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »Urprimat« (01.03.2015, 15:44)


birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

2

01.03.2015, 15:04

Schau mal in deinen Headerdateien nach, wenn du eine Klasse brauchst, jedoch nur deklarativ, also du deklarierst nur Variablen dieses Typs oder so und brauchst ihre Methoden nicht (was in Headerdateien schon mal vorkommt), brauchst du keinen Include sondern kannst dich einer Forward-Declaration bedienen. Das heißt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class XYZ; // Forward declaration - du brauchst nur den Namen

class MyClass : public ZYX
{

...

   XYZ* MyVar; // Geht auch ohne Include

   public inline int getValue()
   {
        return MyVar->abc; // Geht nicht, sowas muss dann in die .cpp-Datei wo ein ordentlicher include gemacht wird
   }

}



Der Vorteil ist jetzt, dass andere die den Header includen, weniger andere includes durch deinen header machen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »birdfreeyahoo« (01.03.2015, 21:35)


3

01.03.2015, 15:14

Das geht nicht, man kann keine Klassen instanzieren, die du vorher nur durch Vorwärtsdeklaration bekannt gegeben hast, der Compiler brauch schon die Definition. Man kann aber Zeiger darauf erstellen ;)

4

01.03.2015, 15:28

Das geht nicht, man kann keine Klassen instanzieren, die du vorher nur durch Vorwärtsdeklaration bekannt gegeben hast, der Compiler brauch schon die Definition. Man kann aber Zeiger darauf erstellen ;)

Oder Referenzen.

General spricht das aber für schlechtes Design wenn 2 Klassen sich gegenseitig kennen.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

5

01.03.2015, 15:35

Hey,
habe gerade mal nachgeschaut. Leider benutze ich immer auch die Funktionen der Klasse.
Somit, wenn ich das richtig verstanden habe, komm ich um ein #include nicht rumc :thumbdown:


Mfg Urprimat
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.

Linus Torvalds

Julién

Alter Hase

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

6

01.03.2015, 16:00

So lange du nur "Forward Declarations" als Variablen bzw Pointer verwendest, dann passt es.
Generell würde ich keine Funktionen im Header implementieren (Seit C++ 11 kann man Templates doch auch in der Cpp-Datei haben, oder?).

Das heißt, du brauchst den Include in im Header nicht, aber (nur) im der Definition (also Cpp-Datei der Klasse).

<edit>
Funktionsaufrufe der Klasse sollten nur innerhalb der Defnition vorkommen, dann klappt es auch mit dem Forward Declaring.
</edit>

@Koschi: Definiere "wenn 2 Klassen sich gegenseitig kennen", bin schon öfters darüber gestolpert und verstehe es nicht konkret.
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

7

01.03.2015, 16:10


@Koschi: Definiere "wenn 2 Klassen sich gegenseitig kennen", bin schon öfters darüber gestolpert und verstehe es nicht konkret.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
class A
{
    B m_b;
}

class B
{
    void doSomeThing(const A& value);
}


Klasse A kennt Klasse B und Klasse B kennt Klasse A.

Edit: habe das Bsp. mal modifiziert.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Koschi« (01.03.2015, 17:22)


8

01.03.2015, 17:12

Das wäre dann ja eine endlos-Rekursion :D

9

01.03.2015, 17:24

Das wäre dann ja eine endlos-Rekursion :D


Habe es mal modifiziert.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

10

01.03.2015, 18:30

@ Julién

Danke, ich habe ein paar Includes in die Cpp datei verschoben, da sie auch nur wirklich dort gebraucht wurden.

Klappt nun. :thumbsup:
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.

Linus Torvalds

Werbeanzeige