эквивалент auto_ptr илиshared_ptr в управляемых классах C++/CLI.
-
05-07-2019 - |
Вопрос
В 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-Информация".Следуя вашему предложению, я проверил STL.Net, но он доступен только в Visual Studio 2008 и предоставляет контейнеры + алгоритмы, но не имеет интеллектуальных указателей.
Решение
Я нашел ответ на кодпроект :
Нишант Сивакумар опубликовал статью об этом на сайте http://www.codeproject.com/KB/mcpp/CAutoNativePtr.aspx
На этой странице также найдите комментарий Дениса Н.Шевченко:он предоставляет реализацию в стиле stl, которая работает довольно хорошо.
Другие советы
Я не проверял это тщательно, но как насчет чего-то вроде следующего:
#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 в ссылочных классах.
STL.Net документирован здесь.Я не знаю, в каком он состоянии и какую пользу он может принести вам.