通过cli包装器

时间:2015-11-09 18:58:56

标签: c++-cli

我有一个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错误而没有被编译。

1 个答案:

答案 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模式和终结器管道代码。