指向抽象类的指针
Pointer to an abstract class
我正在尝试使用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);
}
}
and inside manB do:
inline manA ^ manB::GetA()
{
A *value = m_B->getA();
manA ^ final;
final->UnmanagedObject = value;
return final;
}
编写包装器并不意味着编写相同的本机类。不要让manA
成为一个抽象类,你的问题就解决了。
public ref class manA abstract
{
public:
manA(A*);
virtual ~manA();
virtual Foo() { m_A->foo(); }
virtual Boo() { m_A->boo(); }
virtual Goo() { m_A->goo(); }
//Also there should be an error like "Hey, What is the return type of those functions?"
//"virtual void Foo()" or "virtual int Foo()" or something else
private:
A* m_A;
};
inline manB::manB()
{
m_B = new B;
}
我认为这一行出现了错误,因为B是从抽象类A派生出来的,没有实现类A中定义的纯函数,所以B也是一个抽象类。永远不能创建抽象类b的实例
我认为问题是这样的
return gcnew manA(value)
充分利用泛型。
public ref class manB
{
public:
manB()
{
m_B = new B();
}
generic<T> where T : manA
manA ^ GetA()
{
A *value = m_B->getA();
T ^ final = Activator::CreateInstance<T>();
final->UnmanagedObject = value;
return final;
}
/* or
generic<T> where T : manA
T ^ GetA()
{
A *value = m_B->getA();
T ^ final = Activator::CreateInstance<T>(); //this requires T has a public default contructor.
final->UnmanagedObject = value;
return final;
}
*/
!manB()
{
delete m_B; //don't forget to release the native resource
}
private:
B * m_B;
};
相关文章:
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 两个抽象类,派生自同一个基类.如何访问从一个抽象类到另一个抽象类的指针
- 删除指向抽象类的指针向量
- 如何将抽象类指针作为Q_PROPERTY?
- 为什么我可以取消引用指向抽象类的指针?
- 指向抽象类的指针数组:指向 nullptr 或不指向 nullptr (C++)
- C++ abort() 在函数内的抽象类对象指针调用上
- 抽象类和独特的指针
- 如何使用抽象类指针避免内存泄漏
- 如何从抽象类中删除指针
- 指向模板抽象类的指针向量
- 指针到抽象类的功能超载
- 使用抽象类时,如何正确删除指针
- 抽象类和唯一指针 c++ 错误
- 尝试在映射C++中存储指向抽象类的指针
- 如何使用 Rcpp 公开抽象类的指针?
- 抽象类和指针
- 重写指向抽象类的指针的引用值无效
- 使用智能指针将右值引用绑定到抽象类的替代方法
- 指向抽象类的指针