Include Problem mit typedefs
-
Hi,
ich hab dein ein Problem und zwar hab ich 2 .h Dateien:
/*Cvar.h*/ #include <boost\shared_ptr.hpp> #include <log4cplus\logger.h> #include <datastore\cvarStore.h> typedef std::map<tstring, CVar> CVarMap; class CVarManager : public pattern::ISubject { /*....*/ private: CVarStorePtr m_Store; /*....*/ }; }
/*CvarStore.h*/ #include <datastore\cvar.h> #include <tstring.h> #include <log4cplus\logger.h> typedef boost::shared_ptr<CVarStore> CVarStorePtr; class CVarStore { public: CVarStore(tstring Logger = _T("CVarStore"), bool Overwrite = false) : m_Overwrite(Overwrite), m_Logger( log4cplus::Logger::getInstance( Logger) ) { }; virtual ~CVarStore() {}; virtual bool Save(CVarMap::const_iterator First, CVarMap::const_iterator Last) = 0; virtual bool Load(CVarManager& Manager) = 0; bool SetOverwrite(bool Overwrite = true) { m_Overwrite = Overwrite; }; protected: bool m_Overwrite; log4cplus::Logger m_Logger; };
Wie mach ich jetzt in cvar.h CVarStorePtr und in cvarStore.h CVarMap bekannt. Weil so gehts mit VS2010 ned.
Greetz
-
Mach doch einfach einen header, der beide typedefs enthält, und inkludiere diesen.
-
Cachus schrieb:
Mach doch einfach einen header, der beide typedefs enthält, und inkludiere diesen.
Hmm aber das loset ja das Problem au ned:
#ifndef __CVAR_TYPEDEFS__ #define __CVAR_TYPEDEFS__ #include <datastore\cvar.h> #include <datastore\cvarStore.h> #include <tstring.h> #include <boost\shared_ptr.hpp> #include <map> namespace datastore { typedef std::map<tstring, CVar> CVarMap; typedef boost::shared_ptr<CVarStore> CVarStorePtr; } #endif
und den jetzt in beide (cvar.h und cvarStore.h) eingefuegt. Jetzt is aber das Problem das in dem Header CVar + CVarStore nicht bekannt ist und in den anderen die typedefs au ned.
-
Erstmal bringt es nur Verwirrung, wenn zwei Header sich gegenseitig einbinden (sowohl für dich als auch für den Präprozessor). Und zweitens könntest du es mal mit Forward-Deklarationen versuchen.
-
CStoll schrieb:
Erstmal bringt es nur Verwirrung, wenn zwei Header sich gegenseitig einbinden (sowohl für dich als auch für den Präprozessor). Und zweitens könntest du es mal mit Forward-Deklarationen versuchen.
Zum 2.Punkt: Hab ich versucht aber hat leider au nichts geholfen sagt mir immer nich CVarMap: Kein Klasse oder Namespace
Und zum 1. Ich versuch mal zu erklaren was ich machen will und vielleicht kann mir dann wer nen andern Loesungsweg geben:
Und zwar hab ich einmal ein File: cvar.h
drin enthalen:
-struct cvar zum speichern parse usw von den cvars
-class cvarManager zum verwalten der cvars in einer map, exist, get, set
bzw gibts noch 2 Methoden Save und Load. Um mich nicht festzulegen wie gespeichert werden soll hab ich mich fuer das Strategy Pattern entschieden.Da kommt jetzt auch File 2 cvarStore zum einsatz um nicht alles in einem file zu haben.
File: cvarstore
- interface fuer die cvarStore class
- eine simple implementation dafuerGreetz und danke schon mal
-
Naja, zb
class B; typedef B C; typedef std::vector<B> BVec; class B { }; int main() { C c; BVec vec; }
Funzt bei mir. vielleicht kannst du den zentralen header ähnlich aufbauen(natürlich ohne deklaration der klasse). Tut mir leid wenn ich mich grade vertue, ich brauch eventuell doch mehr schlaf als 1-2 stunden pro nacht.(Da programmiert es sich doch nicht ganz so gut)
namespace datastore { class CVarStore; typedef boost::shared_ptr<CVarStore> CVarStorePtr; }
Und sowas.