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 dafuer

    Greetz 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.


Log in to reply