Проблема множественного наследования SWIG при возврате класса C++, завернутого в интерфейсC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Проблема множественного наследования SWIG при возврате класса C++, завернутого в интерфейс

Сообщение Anonymous »

Я пытаюсь обернуть класс C++ с помощью SWIG, который включает множественное наследование, и другой класс с методом, возвращающим общий указатель на класс, объявленный как интерфейс в SWIG. Вот упрощенная версия кода:
Классы C++

Код: Выделить всё

// ClassA.h
class ClassA {
public:
void MethodA() {};
};

// ClassB.h
class ClassB {
public:
void MethodB() {};
};

// ClassC.h
#include "ClassA.h"
#include "ClassB.h"

class ClassC : public ClassA, public ClassB {
public:
void MethodC() {};
};

// ClassD.h
#include "ClassA.h"
#include 

class ClassD {
public:
std::shared_ptr GetClassA() {
return std::make_shared();
}
};
Файлы интерфейса SWIG

Код: Выделить всё

// ClassA_module.i
%module ClassA_module
%include 

%shared_ptr(ClassA)
%interface(ClassA)

%include "ClassA.h"

// ClassB_module.i
%module ClassB_module
%include 

%shared_ptr(ClassB)
%interface(ClassB)

%include "ClassB.h"

// ClassC_module.i
%module ClassC_module

%shared_ptr(ClassC)

%include "ClassC.h"

// ClassD_module.i
%module ClassD_module

%shared_ptr(ClassD)

%include "ClassD.h"
Мне необходимо объявить ClassA и ClassB как интерфейсы для SWIG, иначе у меня появится следующее предупреждение:
Предупреждение 833: предупреждение для ClassC, базовый класс B игнорируется. Множественное наследование не поддерживается в C#.
Но при этом будет использоваться интерфейс, созданный для метода GetClassA, когда ClassD обернут, генерируя приведенный ниже код:
Сгенерированный код оболочки C#

Код: Выделить всё

public ClassASwigInterface GetClassA() {
IntPtr cPtr = WrapperPINVOKE.ClassD_GetClassA(swigCPtr);
ClassASwigInterface ret = (cPtr == IntPtr.Zero) ? null : new ClassASwigInterface(cPtr, true);
if (WrapperPINVOKE.SWIGPendingException.Pending) throw WrapperPINVOKE.SWIGPendingException.Retrieve();
return ret;
}
И компиляция приведет к ошибке:

Ошибка CS0144: невозможно создать экземпляр абстрактного типа или интерфейса ClassASwigInterface.

Как правильно обернуть ClassD::GetClassA(), чтобы возвращаемый результат shared_ptr можно использовать на стороне C#, учитывая, что ClassA объявлен как интерфейс для поддержки множественного наследования в SWIG?

Подробнее здесь: https://stackoverflow.com/questions/797 ... s-an-inter
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»