2008-10-06 8 views
6

В C++/CLI вы можете использовать собственные типы в управляемом классе, так как не разрешено удерживать член собственного класса в управляемом классе: вам нужно использовать указатели в таком случае.auto_ptr или shared_ptr эквивалент в управляемых классах C++/CLI

Вот пример:

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 ! 

}; 

Кто-нибудь знает эквивалент shared_ptr в мире C++/CLI?

Редактировать: Спасибо за ваше предложение «1800-Information». Следуя вашему предложению, я проверил STL.Net, но он доступен только в Visual Studio 2008, и он предоставляет контейнеры + алгоритмы, но без интеллектуальных указателей.

+0

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

ответ

2

Я нашел ответ на codeproject:

Nishant Sivakumar опубликовал статью об этом в http://www.codeproject.com/KB/mcpp/CAutoNativePtr.aspx

На этой странице также ищет комментарий Дениса Н. Шевченко: он обеспечивает СТЛ-как реализация это работает очень хорошо.

+0

, пожалуйста, избегайте ссылок, они могут получить сломанный – 2015-11-26 11:03:24

0

STL.Net is documented here. Я не знаю, в каком состоянии оно находится, или о том, каким он может быть для вас.

1

я тщательно не проверял это, но как о чем-то вроде следующего:

#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(); 
    } 
}; 

Это должно позволить вам использовать shared_ptrs C++ 11/BOOST в interchangebly в классах реф.

 Смежные вопросы

  • Нет связанных вопросов^_^