10

在 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 !

};

有人知道 C++/CLI 世界中的 shared_ptr 等价物吗?

编辑:感谢您的建议,“1800-信息”。根据您的建议,我检查了 STL.Net,但它仅适用于 Visual Studio 2008,它提供容器 + 算法,但没有智能指针。

4

3 回答 3

2

我在codeproject上找到了答案:

Nishant Sivakumar 在http://www.codeproject.com/KB/mcpp/CAutoNativePtr.aspx上发布了一篇关于此的文章

在此页面上,还可以查看 Denis N. Shevchenko 的评论:他提供了一个运行良好的类似 stl 的实现。

于 2008-10-06T23:26:04.760 回答
2

我还没有彻底测试过这个,但是像下面这样的东西怎么样:

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

这应该让您可以在 ref 类中互换使用 C++11/Boost 的 shared_ptrs。

于 2012-09-28T16:35:51.787 回答
0

STL.Net 记录在这里。我不知道它处于什么状态或它可能对您有什么用处。

于 2008-10-06T22:24:38.487 回答