friend klappt nicht



  • Hallo, ich habe eine Klasse mit diesem Aufbau:

    // HWBuffer.cpp
    class HWBuffer : public Buffer, public Resource {
    private:
    
       friend class HWResourceManager;
    
       HWBuffer (ResourceManager* creator);
       ~HWBuffer ();
    
       virtual bool init();
    
    public:
     ...
    };
    

    Wenn ich jetzt aber in HWResourceManager::createHWBuffer() versuche einen HWBuffer mit new zu erzeugen, dann kriege ich diese Compiler Fehler:

    d:\microsoft visual studio 10.0\vc\include\memory(1664): error C2248: 'HWBuffer::~HWBuffer' : cannot access private member declared in class HWBuffer'
    1> hwbuffer.h(57) : compiler has generated 'hwbuffer::~hwbuffer' here
    1> hwbuffer.h(24) : see declaration of hwbuffer'
    1> d:\microsoft visual studio 10.0\vc\include\memory(1431) : see reference to function template instantiation 'void std::tr1::shared_ptr<_Ty>::_Resetp<_Ux>(_Ux *)' being compiled
    1> with

    Ich raffs nicht. Wieso geht das nicht? 😕



  • Anmerkung: Der HWResourceManager hält eine map<string, shared_ptr<HWBuffer>> als member. Könnte das der Grund sein?



  • Kittor schrieb:

    Anmerkung: Der HWResourceManager hält eine map<string, shared_ptr<HWBuffer>> als member. Könnte das der Grund sein?

    Ja, das ist der Grund. Der shared_ptr<..> ruft nämlich den Destruktor auf.



  • jopp, du musst den shared_ptr zum friend machen.

    smart pointer sind dafür da, deine Zeiger automatisch irgendwann freizugeben.
    Das geht aber nur, wenn der smart pointer auch den Destruktor aufrufen kann.

    Das geht bei dir nicht, da dieser private ist.

    Alternativ könntest du also auch den Destruktor public machen.
    Ich wüsste sowieso nicht, wieso der private sein sollte...


Anmelden zum Antworten