我想用C++/cli來包裝非託管的C++代碼。在C++/cli中,一個類必須被聲明爲抽象如果它具有所有純虛擬函數。現在假設我有下面的代碼在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);
}
現在,如果我做了以上我得到一個聲明爲「抽象」類不能被實例化錯誤。
有沒有解決方案?
注:類A定義了它的所有可能實現的接口。所以也許有一種方法可以定義manA,使其不是抽象的,因此可以被實例化?
我找到了一個解決問題的辦法:
從取出構造的manA和使用屬性
public:
property A* UnmanagedObject
{
void set(A* unmanagedObjPtr)
{
//Or other data marshalling
m_A = (A *)(unmanagedObjPtr);
}
}
和內部MANB做:
inline manA^manB::GetA()
{
A *value = m_B->getA();
manA^final;
final->UnmanagedObject = value;
return final;
}
您需要在Derived類中實現Abstract類的所有純虛函數,否則您的派生類也將變爲Abstract類。 –
我在代碼中看不到任何繼承。 –
B不是來自A – Saurabh