Я пытаюсь обернуть неуправляемый код c ++ с помощью c ++ / cli.В C ++ / cli класс должен быть объявлен abstract , если он имеет все чисто виртуальные функции.Теперь предположим, что у меня есть следующий код на C ++:
class A{
public:
virtual ~A();
virtual void foo() = 0;
virtual void boo() = 0;
virtual void goo() = 0;
};
inline
A::~A()
{
}
class B
{
public:
B();
A* getA() const;
};
inline A* B::getA() const
{
//do something
return (A *) //of something;
}
Как указано выше, я могу вернуть A * без каких-либо ошибок.Теперь предположим, что я обертываю приведенный выше код следующим образом:
public ref class manA abstract
{
public:
manA(A*);
virtual ~manA();
virtual void Foo() = 0;
virtual void Boo() = 0;
virtual void Goo() = 0;
private:
A* m_A;
};
inline
manA::~manA()
{
}
inline
manA::manA(A*)
{
//data marshalling to convert A* to manA
}
public ref class manB
{
public:
manB();
manA ^ GetA();
private:
B * m_B;
};
inline manB::manB()
{
m_B = new B;
}
inline manA ^ manB::GetA()
{
A *value = m_B->getA();
return gcnew manA(value);
}
Теперь, если я сделаю это, я получу класс, объявленный как 'абстрактный', не может быть создан error.1016 * Есть ли какое-нибудь решение для этого?
Примечание: класс A определяет интерфейс для всех возможных его реализаций.Так, может быть, есть способ определить manA так, чтобы он не был абстрактным и, следовательно, мог быть создан?
Я нашел решение проблемы:
Удалите конструктор из manA и используйте свойство
public:
property A* UnmanagedObject
{
void set(A* unmanagedObjPtr)
{
//Or other data marshalling
m_A = (A *)(unmanagedObjPtr);
}
}
и внутри manB do:
inline manA ^ manB::GetA()
{
A *value = m_B->getA();
manA ^ final;
final->UnmanagedObject = value;
return final;
}