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-Information」という提案をありがとう。あなたの提案に従って、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 に答える