Expected class name before '{' token - Error mit OOP
-
Du meinst so?
//katze.hpp #ifndef _H_KATZE_ #define _H_KATZE_ #include "includes.hpp" class Katze : public Tier { private: string itsFellfarbe; Tier itSelf; public: Katze(string name, unsigned short int groesse, string fellfarbe); string getFellfarbe(); }; #endif
//katze.cpp #include "katze.hpp" Katze::Katze(string name, unsigned short int groesse, string fellfarbe) { itSelf = Tier(name,groesse); itsFellfarbe = fellfarbe; } string Katze::getFellfarbe() { return itsFellfarbe; }
In welcher Funktion soll ich den Konstruktor von Tier aufrufen?
//edit: Ich habe an der includes.hpp erstmal nichts verändert. Das mache ich, wenn der Code funktioniert.
-
Blu-Ray schrieb:
und dein includes.hpp ist schlechter Stil
Soll ich stattdessen die Files einzeln includen?
Normalerweise inkludiert man in einer Datei genau die Header, die für das Compilieren nötig sind (Dient auch ein wenig der Dokumentation). Zudem sollte man niemals using namespace in einen Header verwenden. Im Zusammenspiel mit Precompiled Headern mag es sinnvoll sein gewisse Header Projektweit zu inkludieren, dies ist aber nicht der Regelfall und sollte einzeln genau überlegt sein.
Und zu guter letzt: "#include <string.h>" dient nicht dem Include der C++ Klasse std::string, entweder meinst du "#include <string>" [std::string] oder "#include <cstring>" [Für die C-Funktionen zu strings].
-
Ich habe jetzt statt
#include <string.h>
folgendes verwendet (für std::string)
#include <string>
Sollte ich jeden String als std::string deklarieren, wenn kein using namespace std verwendet werden soll?
-
Blu-Ray schrieb:
Sollte ich jeden String als std::string deklarieren, wenn kein using namespace std verwendet werden soll?
Würde ich machen, besonders im Header. Ist es für dich sehr schlimm, wenn noch ein Namensraumqualifizierer vorne dran steht?
-
Also ich habe std:: jetzt vor cout und vor alle string Deklarationen geschrieben.
Vielen Dank bis hierher für das Aufräumen des Codes
Allerdings besteht der FehlerD:\workspace\test\katze.hpp|6|error: expected class-name before '{' token|
Durch die Verwendung von der Klasse Tier in der katze.hpp bekomme ich nun zusätzlich folgenden Fehler:
D:\workspace\test\katze.hpp|9|error: `Tier' does not name a type
obwohl die tier.hpp ja eigentlich mit inkludiert wird
-
Zeig mal, wie du aktuell die Inkludes hast. Denn wie du es vorhin hattest, da wurde schlussendlich die Klasse
Katze
vor der KlasseTier
deklariert, was natürlich zu einem Fehler führte.Grüssli
-
Es wäre es auch nicht verkehrt sich mal mit dem Thema const-correctness auseinander zu setzen (a. Du kopierst ständig strings, wo es nicht nötig wäre und b. nicht-modifizierende Zugriffe (wie getter) sollten const sein).
-
asc schrieb:
(a. Du kopierst ständig strings, wo es nicht nötig wäre und b. nicht-modifizierende Zugriffe (wie getter) sollten const sein).
Sonst übergebe ich Parameter auch über Referenzen, allerdings wollte ich dieses Beispiel so einfach wie möglich halten.
An der Include-File habe ich nichts verändert. Die ist immernoch:
#include <iostream> #include <string> #include "tier.hpp" #include "katze.hpp"
Eigentlich wird die Klasse Tier ja vor der Klasse Katze eingefügt und wird von jeder Datei inkludiert
-
Ist dir eigentlich mal aufgefallen, dass tier.hpp die Datei includes.hpp einbindet, welche die Datei tier.hpp einbindet?
[Edit] Nicht, dass das zum Fehler führen würde. Schön ist aber was anderes.
[Edit] Ach doch, tuts. In main.cpp inkludierst du includes.hpp, was wiederum tier.hpp inkludiert. tier.hpp inkludiert wiederum tier.hpp (ohne Auswirkung) und dann katze.hpp. katze.hpp inkludiert nix mehr. Somit steht die Klasse Katze über der Klasse Tier.
Wie Dravere es wohl auch schon rausgefunden und ich überlesen hab
Ich habe an der includes.hpp erstmal nichts verändert. Das mache ich, wenn der Code funktioniert.
Mach sowas am besten direkt weg, wenn wir dich darauf hinweisen. Denn ein solches include-Gewurstel kann ganz schön kompliziert werden.
-
Hör überhaupt mit zentralen Headerdateien auf. Auch sowas ist unnötig:
#include "tier.hpp" // <-- #include "katze.hpp"
Wenn
Tier
eine Basisklasse vonKatze
ist, muss dieTier
-Klassendefinition im"katze.hpp"
-Header automatisch bekannt sein. Inkludiere"tier.hpp"
also dort.Ach ja, und verwende keine Bezeichner, die mit Unterstrichen anfangen oder zwei Unterstriche enthalten, da diese für Compiler und Implementierung reserviert sind (das betrifft die Include-Guards).