以下代码在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个函数。 (最后两个是假的 - 现在都是空的)
答案 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文件,并以灰色颜色说出问题所在。