Privater Konstuktor und Factoryfunktion
-
Hi,
warum geht das net?
namespace AGE { class CKernel { public: friend CKernel* CreateKernel(void); AGEAPI void Release(void); private: CKernel(void); ~CKernel(void); TPointer<CLog> m_pLog; }; } // Namespace extern "C" AGEAPI AGE::CKernel* CreateKernel(void);
c:\dokumente und einstellungen\chris\eigene dateien\programmieren\projekte\age\source\engine\kernel.cpp(42) : error C2248: "CKernel::CKernel" : Kein Zugriff auf private Element, dessen Deklaration in der Klasse "AGE::CKernel" erfolgte
c:\dokumente und einstellungen\chris\eigene dateien\programmieren\projekte\age\include\engine\kernel.hpp(34) : Siehe Deklaration von 'CKernel::CKernel'ChrisM
-
erstens mal lass der Funktion ihren namen
extern "C" AGE::CKernel *AGE::CreateKernel () { return new AGE::CKernel; } //bsp
und dann muss der Compiler wissen, dass es eine Funktion mit C-Bindung ist, dass kannst du ihm aber bei der friend Deklaration (korrigiert mich, wenn das nicht stimmt. ich hab's nur ausprobiert) nicht sagen. Mach es davor:
namespace AGE { class CKernel; extern "C" CKernel *CreateKernel(void); class CKernel { public: friend CKernel* CreateKernel(void); void Release(void); private: CKernel(void) {} ~CKernel(void) {} }; } // Namespace extern "C" AGE::CKernel *AGE::CreateKernel(void) { return new AGE::CKernel; }
-
Gut, ich hab CreateKernel() jetzt im Namespace drin und alles geht, aber krieg ich das auch irgendwie raus?
ChrisM
-
aber krieg ich das auch irgendwie raus?
Sicher.
namespace AGE { class CKernel; } extern "C" AGE::CKernel* CreateKernel(void); namespace AGE { class CKernel { public: friend CKernel* ::CreateKernel(void); //... }; } // Namespace extern "C" AGE::CKernel* CreateKernel(void) { return new AGE::CKernel(); }
-
Danke!
ChrisM