[C++] Wrapper von C API mit nicht löschbarem "default" Pointer

FBIagent

Erfahrenes Mitglied
Hallo,

ich probiere gerade für eine kleine C-Bibliothek einen C++-Wrapper zu schreiben.

Nun erstelle ich für alle neuen Resourcen einen std::shared_ptr:
Code cpp:
1void* API_CreateAWindow(...) -> std::shared_ptr<Window> Window::Create(...)



Die Klasse Window hat jetzt beispielsweise eine methode:
Code cpp:

1void* API_WindowGetSurface(void* window) -> ? Window::GetSurface()




Mein Problem liegt darin, dass ich auch das Surface kapsele, da das Fenster allerdings immer nur sein "default" Surface hat(das Surface des Fensters kann man nicht ändern), möchte ich hier nicht einen std::shared_pointer zurück liefern sondern so etwas wie einen std::weak_ptr der das Object nicht besitzt aber Zugriff darauf erlaubt(nennen wir es mal std::default_ptr).

Das Surface eines Fensters ist sozusagen ein single pointer der nur vom Fenster selbst "zerstört" wird, wenn das fenster schließt.

Gedacht hatte ich an so etwas:
C++:
class Window
{
...
    void* mHandle;
    default_ptr<Surface> mSurface;

    default_ptr<Surface> GetSurface()
    {
        if (mSurface.empty())
        {
            void* handle = API_WindowGetSurface(mHandle);
            mSurface = handle;
        }

        return mSurface;
    }
};

Aber ich bin mir nicht so sicher ob das der richtige Anssatz dafür ist.

Hat jemand schon einmal Erfahrung mit so etwas gemacht?
 
Zuletzt bearbeitet:
Ich habe es nun so gelöst das ich eine bool Membervariable zum Surfacewrapper hinzugefügt habe die angibt ob der Surfacewrapper bei zerstörung das Apihandle freigeben soll oder nicht.
Das Wrapper-Object als shared_ptr halte ich in der Windowwrapper klasse und GetSurface resultiert diesen shared_ptr.

Also im endeffect so etwas wie:
C++:
class Window
{
    void* mHandle;
    std::shared_ptr<Surface> mSurface;

    std::shared_ptr<Surface> GetSurface()
    {
         if (mSurface.empty())
        {
            void* handle = API_WindowGetSurface(mHandle);
            mSurface = new Surface(handle, false);
        }

        return mSurface;
    }
};

class Surface
{
    void* mHandle;
    bool mFreeOnDestruction;
    
    Surface(void* handle, bool freeOnDestruction)
        : mHandle(hande), mFreeONDestruction(freeOnDestruction)
    {}

    ~Surface()
    {
        if (mFreeOnDestruction)
            API_FreeSurface(mHandle);
    }
};
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück