托管 C++/CLI 类中的 auto_ptr 或 shared_ptr 等效项

发布于 2024-07-06 23:51:18 字数 544 浏览 7 评论 0 原文

在 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,并且它提供容器+算法,但没有智能指针。

In C++/CLI , you can use native types in a managed class by it is not allowed to hold a member of a native class in a managed class : you need to use pointers in that case.

Here is an example :

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 !

};

Does anyone know of an equivalent of shared_ptr in the C++/CLI world?

Edit:
Thanks for your suggestion, "1800-Information". Following your suggestion, I checked about STL.Net but it is only available with Visual Studio 2008, and it provides containers + algorithms, but no smart pointers.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

清风不识月 2024-07-13 23:51:18

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

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

这应该让你可以在引用类中互换使用 C++11/Boost 的共享指针。

I haven't thoroughly tested this but how about something like the following:

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

This should let you use C++11/Boost's shared_ptrs interchangebly in ref classes.

说谎友 2024-07-13 23:51:18

我在 codeproject 上找到了答案:

Nishant Sivakumar 在 http://www.codeproject.com/KB/mcpp/CAutoNativePtr.aspx

在此页面上,还要查找Denis N. Shevchenko 的评论:他提供了一个类似 stl 的实现,效果非常好。

I found the answer on codeproject :

Nishant Sivakumar posted an article about this at http://www.codeproject.com/KB/mcpp/CAutoNativePtr.aspx

On this page, also look for the comment by Denis N. Shevchenko : he provides a stl-like implementation that works quite well.

小梨窩很甜 2024-07-13 23:51:18

对于那些来这里寻找托管 auto_ptr 的人:

#include <msclr/auto_gcroot.h>

...
{
  msclr::auto_gcroot<ManagedType^> item(gcnew ManagedType());
  ...
}

https://learn.microsoft.com/en-us/cpp/dotnet/auto-gcroot-class

For those who come here and looking for a managed auto_ptr:

#include <msclr/auto_gcroot.h>

...
{
  msclr::auto_gcroot<ManagedType^> item(gcnew ManagedType());
  ...
}

https://learn.microsoft.com/en-us/cpp/dotnet/auto-gcroot-class

风渺 2024-07-13 23:51:18

STL.Net 记录在此处。 我不知道它处于什么状态,也不知道它对你有什么用处。

STL.Net is documented here. I don't know what state it is in or what use it might be for you.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文