Objekt in Methode zurückgeben
-
Das ist schon richtig, wenn man alles was in deinem Code fehlt richtig ergänzt. Daher ist anzunehmen, dass eben dieser Teil bei dir nicht richtig ist. Wahrscheinliche Fehlerquelle sind fehlende Includes/Deklarationen, eventuell auch ein fehlendes Semikolon nach einer Klassendefinition.
Versuche mal ein minimales aber vollständiges Beispiel zu erstellen, welches nicht mehr funktioniert. Und dann findest du dabei entweder deinen Fehler schon selber oder du kannst dieses vollständige Beispiel nochmal hier posten.
-
In jeder *.cpp-Datei inkludiere ich eine Geader-Datei (nennen wir sie einfach mal main.h), welche alle anderen Header-Dateien im Projekt inkludiert...
Oder muss ich die dort nochmal einzeln inkludieren?
Gruß
Bastian
-
barratator schrieb:
In jeder *.cpp-Datei inkludiere ich eine Geader-Datei (nennen wir sie einfach mal main.h), welche alle anderen Header-Dateien im Projekt inkludiert...
Oder muss ich die dort nochmal einzeln inkludieren?
Jo, musst du einzeln machen. So ein Include ist nichts anderes als ne Textersetzung, d. h. er kopiert den Inhalt der inkludierten Datei an die Stelle, wo das include steht. Dann ist klar, dass Klasse2 entweder vor oder hinter Klasse1 stehen muss und somit einer den anderen nicht kennt.
[Edit] Außerdem sind die Typen in den jeweils anderen Headern immer noch nicht bekannt.
-
barratator schrieb:
In jeder *.cpp-Datei inkludiere ich eine Geader-Datei (nennen wir sie einfach mal main.h), welche alle anderen Header-Dateien im Projekt inkludiert...
Das ist schlecht. Halte die Abhängigkeit so niedrig wie möglich. Wenn du in A.h nur einen Typ B brauchst, dann inkludiere in A.h auch nur B.h (und wenn du sogar nur B* oder B& brauchst, mach am besten nur eine Vorwärtsdeklaration).
-
So, ich hab jetzt mal alles so umgebaut, dass immer nur das inkludiert wird, was wirklich gebraucht wird. Klappt bis auf den selben Fehler wie eben auch perfekt (scheint sogar performanter zu sein
)Hier ist meine Klasse, wo die Methode deklariert wird:
#ifndef __C_ENGINE_H_INCLUDED__ #define __C_ENGINE_H_INCLUDED__ #include "irrlicht/irrlicht.h" #include "CBaseEntity.h" #include "CEntityCamera.h" //definiert die Klasse CEntityCamera class engine { public: engine(); void create(int width, int height, CString title); void release(); void renderAll(); bool run(); CEntityCamera createCamera(); irr::IrrlichtDevice *device; irr::video::IVideoDriver *driver; irr::scene::ISceneManager *smgr; }; #endifJetzt bekomme ich folgende Fehler:
error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'createCamera' (engine.h, Zeile 18) error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.ient\engine.h (engine.h, Zeile 18) warning C4183: 'createCamera': Rückgabetyp fehlt; Memberfunktion, die 'int' zurückgibt wird angenommen (engine.h, Zeile 18)Ich hab auch schon sämtliche andere Klassen und Dateien abgesucht, ob nicht irgendwo (am Ende einer Klasse?) ein ; fehlt...Aber ich finde einfach nichts.
Gruß
Bastian
-
Kannst du mal (den relevanten Teil von) CEntityCamera.h zeigen?
PS: Meinst du es ist ne gute Idee, dich bei deinem Kenntnisstand bereits mit 3D-Engines zu beschäftigen?;)
-
CEntityCamera.h
#ifndef __C_CENTITYCAMERA_H_INCLUDED__ #define __C_CENTITYCAMERA_H_INCLUDED__ #include "engine.h" class CEntityCamera : CBaseEntity { public: CEntityCamera(engine *gameEngine); private: irr::scene::ICameraSceneNode *camera; }; #endifJa, ich halte es mehr oder weniger für sinnvoll

Ich habe schon in einer anderen Sprache ziemlich viel mit Irrlicht gemacht (was sich sogar sehen lässt). Aber diese andere Sprache kann leider nicht sonderlich viel, weshalb es notwenig war auf C++ umzuschwenken :S
-
Du hast eine zyklische Abhängigkeit (die Header inkludieren sich gegenseitig), das kann nicht gehen.
Ersetze in CEntityCamera.h das "#include "engine.h"" durch "class engine;" und "class ICameraSceneNode;" und inkludiere den Header von CBaseEntity.
-
Yeah^^ Es klappt! Vielen Dank!

Hat jemand ein etwas umfangreicheres Tutorial bzgl. includes?
In meinem Buch steht das nur ganz kurz angeschlagen...Sowas wie "class xyz;" gibt es garnicht :S
Gruß
Bastian
-
Einen kleinen Artikel zu dem Thema kann ich liefern, dann solltest du die Problematik verstehen.
-
drakon schrieb:
Einen kleinen Artikel zu dem Thema kann ich liefern, dann solltest du die Problematik verstehen.
Ich hab deinen Text nur überflogen, aber du schreibst:
Wird nämlich zuerst die human.h bearbeitet, sieht der Präprozessor das include "car.h" und holt den Inhalt rein, doch dort steht ja include "human.h", was ja das eigentliche File ist. Ein Mensch kann sich hier kein vernünftiges Verhalten vorstellen und der Präprozessor auch nicht.
Du solltest erwähnen, dass DAS eigentlich nicht das Problem ist, da man in der Regel include-guards (oder Compilerdirektive wie #pragma once) benutzt, die die Endlosrekursion verhindern.
Das eigentliche Problem ist, dass bei zyklischen Headern zwangsläufig ein Typ nicht definiert ist (und zwar der, dessen Header in der UE zuerst inkludiert wird).