我有一个c ++代码,需要通过cli包装器在c#中调用。我被困在操作员重载部分。
//这是我的代码 //Cppclass.h
#ifdef CPP_EXP_EXPORTS
#define CPP_EXP __declspec(dllexport)
#else
#define CPP_EXP __declspec(dllimport)
#endif
class CPP_EXP Cppclass;
CPP_EXP Cppclass operator-(Cppclass const &, Cppclass const &);
class CPP_EXP Cppclass
{
public:
friend CPP_EXP Cppclass operator-(Cppclass const &, Cppclass const &);
};
//这是我的托管c ++代码。
#include "Cppclass.h"
namespace Wrapper
{
public ref class cppwrapclass
{
public:
static cppwrapclass ^ operator-(cppwrapclass%A,cppwrapclass%B)
{
operator-(A.obj,B.obj);
return gcnew cppwrapclass();
}
private:
Cppclass *obj;
};
}
它显示出一个intellisense错误而没有被编译。
答案 0 :(得分:1)
你写一个这样的包装:
public ref class cppwrapclass
{
public:
cppwrapclass(Cppclass *obj)
: obj(obj)
{
}
~cppwrapclass()
{
this->!cppwrapclass();
}
!cppwrapclass()
{
if (obj)
{
delete obj;
obj = nullptr;
}
}
static cppwrapclass^ operator-(cppwrapclass% A, cppwrapclass% B)
{
return gcnew cppwrapclass(new Cppclass(*A.obj - *B.obj));
}
private:
Cppclass* obj;
};
A.obj
的类型为Cppclass*
,因此*A.obj
的类型为Cppclass
,而*A.obj - *B.obj
是一个临时的Cppclass
,需要移到堆中以便被包装器引用,因此复制构造函数调用:new Cppclass(*A.obj - *B.obj)
。
其余的是Dispose
模式和终结器管道代码。