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


Anmelden zum Antworten