Nicht verwalteten Typ als Member einer verwalteten Klasse definieren

Morgen,

Wie der Titel schon sagt möchte ich einen nicht verwalteten Typ als Member einer verwalteten Klasse definieren.
Konkret geht es um die ID3D11Buffer Struktur aus der DirectX API.

ref class MyObject
{
    public:
        ID3D11Buffer MyBuffer;       // Funktioniert nicht
}

Visual Studio sagt mir aber dass das nicht funktioniert.

In einem nicht von mir geschriebenen Projekt, wird hierfür folgendes verwendet.

Microsoft::WRL::ComPtr<ID3D11Buffer> MyBuffer;

Das wäre im Endeffekt genau das was ich brauche, nur ist diese Vorgehensweise
mit der Common Language Runtime wieder nicht kompatibel.

Gibt es irgend eine Alternative zur obigen Lösung, die auch unter der Common Language Runtime
funktioniert?

Wäre sehr dankbar für jede Hilfe!

Gruß Andreas

Hi,

nun, deine Frage ist nicht wirklich C++, denn in Standard C++ gibt es kein ref Keyword (es gibt ganz im Gegenteil dazu eine Hilfsfunktion mit demselben Namen). Das gibt es nur in dem Gefriemel von Microschrott.

Aber Gegenfrage: Hast du mal eine der Standard Smart Pointer Klassen in deiner Klasse verwendet, zum Beispiel std::auto_ptr (C++98) oder std::shared_ptr (C++11)?

Gruss
HH

PS auto_ptr und shared_ptr tun nicht dasselbe! Das waren nur Beispiele.

Hi,

ich hab die Smart-Pointer die du da genannt hast probiert (auch andere),
aber das Problem ist bei jedem das selbe.

Ich werde es vielleicht mal so probieren:

ref class MyObject
{
  public:
    ID3D11Buffer* Ein_Buffer;
    
    MyObject()
    {
    }

    ~MyObject()
    {
       if (Ein_Buffer) Ein_Buffer->Release();
    }
}

void Eine_Funktion()
{
    MyObject^ Ein_Object = gcnew MyObject();
}

So bekomm ich zumindest schon mal keine Fehlermeldung, was ich zwar nicht ganz verstehe
Weil ja die ID3D11Buffer-Struktur ja eigentlich auch ein nicht-verwalteter Typ ist.

Gruß Andreas

ja, aber so erhältst du neben der Verletzung nahezu fast aller Coding Richtlinien auch ein Problem, sollte dieses Objekt mal einem anderen zugewiesen werden, mal davon abgesehen, dass Ein_Buffer natürlich gar nicht initialisiert ist .

Welche Fehlermeldung erhältst du denn, wenn du

ref class MyObject
{
  public:
    std::shared_ptr< ID3D11Buffer> Ein_Buffer;

    MyObject()
    : Ein_Buffer(new ID3D11Buffer)
    {
    }

    virtual ~MyObject()
    {
    }
  };

benutzt?

Gruss
HH

Der Buffer wird dann sowieso im Konstruktor erzeugt, ich hab den Code dafür nur weggelassen,
weil der doch einige Zeilen einnimmt, und hier eigentlich nichts zur Sache tut. Hätte ich vielleicht
als Kommentar schreiben können, sry :grin:

Wenn ich den std::shared_ptr verwende, bekomm ich die selbe Meldung wie bei allen anderen auch:

Error: a member of a managed class cannot be of a non-managed class type

Gruß Andreas

und wenn du den shared_ptr in einer eigenen ref class kapselst?

Gruß
HH

ah, vergiss es, du musst es dann wohl dort ausprogrammieren…

Gruss
HH

Hi,

kurzes Update zu diesem Thema, ich werde nun mehr oder weniger komplett auf
die veralteten Typen verzichten.

Der Aufwand das alles unter einen Hut zu bringen lohnt sich einfach nicht.

Auf jeden Fall danke für die Hilfe, wird wahrscheinlich nicht das letzte mal sein. :grin: