C ++接口错误,非静态成员引用必须相对于特定对象

时间:2013-03-04 15:41:20

标签: c++ interface

我有一个界面,但我不能使用它因为方法应该是静态的......或者另一种解决方案......据我所知它们不能是静态的......:

具有其使用函数定义的图形库:

GraphicsLibrary.h
    virtual void drawText(const std::string& text, const Point& pt, unsigned char r, unsigned char g, unsigned char b);

这里只是为了说清楚,OpenGL是从GraphicsLibrary派生的:

OpenGL.h
class OpenGL : public GraphicsLibrary

OpenGL.cpp使用GraphicsLibrary中的虚函数和括号之间的“做”事情..:

OpenGL.cpp 
void GraphicsLibrary::drawText(const std::string& text, const Point &pt, unsigned char r, unsigned char g, unsigned char b)
{
//does things
}

然后我的主要我使用方法...但它给出了一个错误

MyMain
OpenGL::drawText(toString(mousePos_world), drawPosition, 255, 0, 0);

错误:非静态成员引用必须相对于特定对象


我该如何解决这个问题?我读过我应该让函数静态,但我想我不能......对吧?或者大多数人都说,想想你为什么以这种方式构建类,因为你正在使用其他类的方法,但那是因为我有一个接口......!

3 个答案:

答案 0 :(得分:4)

您需要创建OpenGL class:

的实例
OpenGL ogl;
ogl.drawText(...);

您的函数drawText是该类的成员函数,这意味着它必须在该类的对象上调用。对象是特定类的实例。

然后在那个对象上你可以调用你的函数。

如果您不想创建实例,那么您应该创建函数static,您可以在其上调用它:OpenGL::drawText(...);

答案 1 :(得分:1)

您只需要OpenGL的实例即可将其调用。具体来说,你如何做到这一点取决于你没有给出OpenGL的信息,但它看起来像这样:

OpenGL gl;
gl.drawText(toString(mousePos_world), drawPosition, 255, 0, 0);

您试图将drawText称为静态成员函数(使用::)。由于drawText不是静态的,因此您需要一个对象来调用它。

答案 2 :(得分:0)

您应该创建图形库对象。

std::unique_ptr<GraphicsLibrary> pGL(new OpenGL); //or shared_ptr
pGL->drawText(...);