一些C ++代码在一个项目中给出错误并在另一个项目中编译好?

时间:2012-05-17 08:22:05

标签: c++ xcode

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

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)中project 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个函数。 (最后两个是假的 - 现在都是空的)

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

这可以通过提供 ALL 纯虚拟基本方法的实现来解决。

我假设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;

答案 2 :(得分:1)

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

我刚刚发现您可以点击红色错误消息(右侧),

  

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

Xcode会直接切换到IRenderingEngine.hpp文件,并以灰色颜色说出问题所在。