2015-11-09 3 views
-1

У меня есть код C++, который должен быть вызван в C# оболочкой cli. Я застрял на перегрузке оператора.Вызов кода C++ в C# оболочкой cli

// это мой код //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

Вы пишете оболочку, как это:

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 образец и финализатор для сантехники.

Смежные вопросы