эквивалент auto_ptr илиshared_ptr в управляемых классах C++/CLI.

StackOverflow https://stackoverflow.com/questions/176403

Вопрос

В 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 документирован здесь.Я не знаю, в каком он состоянии и какую пользу он может принести вам.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top