c ++ / cli包装器,用于本机智能指针类的变量

时间:2015-10-28 14:27:00

标签: c++-cli clr wrapper

我是C#和C ++ / CLI的新手,并不熟悉它们。我搜索过但无法找到一个非常简单的现有解决方案(我认为应该是常见的)。

我正在编写一个简单的C ++ / CLI项目(C#中使用的C ++本机dll的包装器)。有很多例子如何为本机类编写包装器:

class CNativeClass { 
    CNativeClass() {}
    void Foo() {}
}

public ref class CNativeClassWrapper {
public:
    CNativeClassWrapper() {
        _Wrapper = new CNativeClass;
    }
    ~CNativeClassWrapper() {
        this->!CNativeClassWrapper();
    }
    !CNativeClassWrapper() {
        delete _Wrapper;
        _Wrapper = nullptr;            
    }
    void Foo() {
        _Wrapper->Foo();
    }
private:
    CNativeClass* _Wrapper;
}

这是简化的示例代码。可能有更多的本机类,可能会有较晚的初始化......很多次要但必要的代码。

是否存在隐藏所有这些细节的本机类变量的包装器? 就像纯C ++中的智能指针模板一样。

此外, 如果本机类实际上是一个智能指针(我的情况的90%,我们使用boost :: shared_ptr<>)代码变得一团糟:

  • 检查可以是if ( _Wrapper )if ( *_Wrapper ),甚至是if ( _Wrapper && *_Wrapper )
  • 访问方法(*_Wrapper)->Foo();
  • 如何重置? (*_Wrapper).reset();_Wrapper->reset();都是正确的但是太混乱了。

有人知道这方面的解决方案吗?

2 个答案:

答案 0 :(得分:0)

我不认为C ++ / CLI框架附带了一个内置类,但您可以轻松地设计自己的类。

看看这个问题:auto_ptr or shared_ptr equivalent in managed C++/CLI classes

我不会使用智能指针。当处理或最终确定包含托管类时,本机对象的托管包装器将负责释放本机对象。

答案 1 :(得分:0)

好吧,我终于来到了这样的包装类:

  • 用于保存常规本机类:

    private void button1_clicked(...)
    {
        HideForms();
        if ((frm1 == null) || (frm1.IsDisposed))
            frm1 = new Form1();
        frm1.MdiParent = this;
        frm1.Dock = DockStyle.Fill;
        frm1.Show();
        frm1.BringToFront();
    }
    
  • 保留template <class T> public ref class native_auto_ptr { public: native_auto_ptr() { _pNative = new T; } native_auto_ptr(const native_auto_ptr<T>% rhs) { _pNative = new T( *rhs._pNative ); } ~native_auto_ptr() { reset(); } void reset() { delete _pNative; _pNative = nullptr; } T* ptr() { return _pNative; } T* operator->() { return _pNative; } operator bool() { return _pNative; } void operator=(const native_auto_ptr<T>% rhs) { *_pNative = *rhs._pNative; } void operator=(const T% rhs) { *_pNative = rhs; } protected: !native_auto_ptr() { reset(); } private: T* _pNative; };

    shared_ptr<>

我很高兴:)

  • 他们隐藏新的/删除作业。
  • 他们很安全。
  • 他们的语法接近常见的智能指针,这很方便。

唯一的问题是带参数的ctors ......(TBD)