簡體   English   中英

當該類具有嵌套抽象類時,如何分配類(使用new)?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM