我是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();
都是正确的但是太混乱了。有人知道这方面的解决方案吗?
答案 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)