1

以下代码在一个 C++ 项目中编译良好RenderingEngine.cpp

IRenderingEngine* CreateRenderer1()
{
    return new RenderingEngine1();
}

但是如果我在 Xcode 4.3.2 中开始一个新项目,它会给出错误:

分配抽象类类型“RenderingEngine1”的对象

定义在IRenderingEngine.hpp

struct IRenderingEngine {
    virtual void Initialize(int width, int height) = 0;    
    virtual void Render() const = 0;
    virtual void UpdateAnimation(float timeStep) = 0;
    virtual void OnRotate(DeviceOrientation newOrientation) = 0;
    virtual ~IRenderingEngine() {}
};

如何解决这个问题?(这是iPhone 3D Programming在其项目 1中的一部分)。

更新:在RenderingEngine.cpp

public:
    RenderingEngine1();
    void Initialize(int width, int height);
    void Render() const;
    void UpdateAnimation(float timeStep);
    void onRotate(DeviceOrientation newOrientation);

private:
    GLuint m_framebuffer;
    GLuint m_renderbuffer;

};

并且这5个功能都已定义。(最后两个是虚拟的——现在都是空的)

4

3 回答 3

3

猜测一下,我会说这取决于您如何使用返回的IRenderingEngine指针。当项目在一个项目中编译时,您必须已经从基类中实现了所有必要的纯虚函数。在失败的编译中,您必须缺少一两个实现。

为什么它在“书”示例中编译,但不是您的示例,很难用您提供的信息来说明。我将检查构建输出以确保您正在编译的源文件(两个类的头文件和实现)正是您认为的那些。您可能正在选择另一个IRenderingEngine没有所有必需的纯虚拟实现的版本。

于 2012-05-17T08:45:20.023 回答
1

这可以通过为所有纯虚拟基础方法提供实现来解决。

我假设RenderingEngine1继承自IRenderingEngine. 所以覆盖并实施

virtual void Initialize(int width, int height) = 0;    
virtual void Render() const = 0;
virtual void UpdateAnimation(float timeStep) = 0;
virtual void OnRotate(DeviceOrientation newOrientation) = 0;
于 2012-05-17T08:22:49.277 回答
1

我在阅读第一章时遇到了同样的问题。这非常令人沮丧。

我刚刚发现你可以点击红色的错误信息(右侧),上面写着,

分配抽象类类型的对象...

Xcode 将直接切换到该 IRenderingEngine.hpp 文件并以灰色显示问题所在。

于 2012-10-26T05:24:35.443 回答