[英]How do I allocate a class (using new) when that class has a nested abstract class?
我是C ++的新手,並且正在移植來自Java的代碼。 我有一個渲染器類,它有一個接口作為參數的方法。 這樣調用者可以定義如何呈現其緩沖區。 現在,當我嘗試“新”移植課程時,我遇到了麻煩。 我收到錯誤'分配抽象類類型的對象'。 這是我的代碼的一部分,我認為我需要做一些事情:
// Interface to the OpenGL ES renderer; consumed by GLView
struct IRenderingEngine {
virtual void initialize(int width, int height) = 0;
virtual void render() const = 0;
virtual ~IRenderingEngine() {}
};
class Renderer : public IRenderingEngine
{
public:
...
class IDrawGLBuffer
{
public:
virtual ~IDrawGLBuffer() {};
virtual void function(VBODescription vboDescription,
ShaderDescription shaderDescription);
};
class ShaderDescription
{
public:
ShaderDescription(){};
ShaderDescription(string vertexShaderText,
string fragmentShaderText,
map<string,GLint>& variableMap,
IDrawGLBuffer& callback,
int vertexDimensions);
GLuint getProgramID() const {return shaderProgramID;};
int getVertexDimensions() const {return vertexDimensions;};
friend class Renderer;
private:
string vertexShaderText;
string fragmentShaderText;
GLuint shaderProgramID;
IDrawGLBuffer callback;
int vertexDimensions;
map<string,GLint> variableMap;
};
class VBODescription
{
public:
VBODescription(){};
VBODescription(string shaderName,
map<string, Buffer>& variableMap,
GLenum usage,
int indexTotal,
GLuint textureID);
int getIndexTotal() const {return indexTotal;};
GLuint getTextureID() const {return textureID;};
friend class Renderer;
private:
GLenum usage;
map<string, Buffer> variableMap;
string shaderName;
int indexTotal;
GLuint textureID;
};
...
};
您不應該,也不能輕易地將接口直接包含在類中,如下所示:
IDrawGLBuffer callback;
這僅為接口分配空間(不占用任何空間,是抽象的),並且您無法知道任何實現的大小(它可能並且可能繼承接口並添加私有成員)。
你應該做的是傳遞一個指向接口實現的指針,然后存儲:
Ctor(IDrawGLBuffer * pDrawImpl);
std::shared_ptr<IDrawGLBuffer> m_DrawImpl;
然后使用指針語法( a->b(c)
)從接口調用方法。
由於編譯器不可能知道接口的實現有多大,因此使用指針來引用內存(這在某種程度上是已知的)變得非常重要。
我在這里使用了一個shared_ptr
來幫助自動釋放impl,雖然你可能需要一個CComPtr
或者你的類有點奇怪, boost::intrusive_ptr
。 使用界面時,智能指針是你的朋友(超過常規)。
內部類“類IDrawGLBuffer”是無關緊要的,因為在創建類Renderer的新實例時將不會分配它的實例(除非Renderer按值包含IDrawGLBuffer的實例,並且您已從摘要中省略它)。
如果創建Renderer的新實例但Renderer不包含其基類(IRenderingEngine)中所有純虛函數的覆蓋,則會給出'allocating an object of abstract class type'
”錯誤。 通常,您的編譯器會告訴您哪些缺失。
編輯:從更新的代碼中,看起來Renderer需要包含void render() and void initialise(int,int)
,但它不是
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.