2008-10-06 10 views
6

In C++/CLI können Sie native Typen in einer verwalteten Klasse verwenden, indem ein Member einer nativen Klasse in einer verwalteten Klasse nicht enthalten ist: Sie müssen Zeiger verwenden In diesem Fall. Hierauto_ptr oder shared_ptr Äquivalent in verwalteten C++/CLI-Klassen

ein Beispiel:

class NativeClass 
{ 
.... 
}; 


public ref class ManagedClass 
{ 
private: 
    NativeClass mNativeClass; // Not allowed ! 

    NativeClass * mNativeClass; // OK 

    auto_ptr<NativeClass> mNativeClass; //Not allowed ! 
    boost::shared_ptr<NativeClass> mNativeClass; //Not allowed ! 

}; 

Kennt jemand ein Äquivalent von shared_ptr in der C++/CLI Welt?

Bearbeiten: Danke für Ihren Vorschlag, "1800-Information". Ihrem Vorschlag folgend, habe ich über STL.Net nachgesehen, aber es ist nur mit Visual Studio 2008 verfügbar und bietet Container + Algorithmen, aber keine Smart Pointer.

+0

http://codereview.stackexchange.com/questions/1695/scoped-ptr-for-c-cli-ensure-managed-object-properly-frees-owned-native-object –

Antwort

2

ich die Antwort auf codeproject fand er eine stl artige Umsetzung das funktioniert ganz gut.

+0

bitte vermeiden Sie Links, die sie bekommen könnten gebrochen –

1

Ich habe nicht gründlich getestet dies aber wie wäre es so etwas wie die folgenden:

#pragma once 

#include <memory> 

template <class T> 
public ref class m_shared_ptr sealed 
{ 
    std::shared_ptr<T>* pPtr; 

public: 
    m_shared_ptr() 
     : pPtr(nullptr) 
    {} 

    m_shared_ptr(T* t) { 
     pPtr = new std::shared_ptr<T>(t); 
    } 

    m_shared_ptr(std::shared_ptr<T> t) { 
     pPtr = new std::shared_ptr<T>(t); 
    } 

    m_shared_ptr(const m_shared_ptr<T>% t) { 
     pPtr = new std::shared_ptr<T>(*t.pPtr); 
    } 

    !m_shared_ptr() { 
     delete pPtr; 
    } 

    ~m_shared_ptr() { 
    delete pPtr; 
    } 

    operator std::shared_ptr<T>() { 
     return *pPtr; 
    } 

    m_shared_ptr<T>% operator=(T* ptr) { 
     pPtr = new std::shared_ptr<T>(ptr); 
     return *this; 
    } 

    T* operator->() { 
     return (*pPtr).get(); 
    } 
}; 

Dies sollte man nimmt C++ 11/Boost des shared_ptrs interchangebly in ref Klassen.