2

我有一个接口,但我不能使用它,因为方法应该是静态的……或者其他解决方案……据我所知,它们不能是静态的……:

定义了它使用的函数的图形库:

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);

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


我应该如何解决这个问题?我读到我应该将函数设为静态,但我认为我不能......对吗?或者大多数人说,想想为什么你用其他类的方法来构建类,但那是因为我有一个接口......!

4

3 回答 3

4

您需要创建一个OpenGL类的实例:

OpenGL ogl;
ogl.drawText(...);

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

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

如果你不想创建一个实例,那么你应该创建你的函数static,你可以像这样调用它: OpenGL::drawText(...);

于 2013-03-04T15:42:53.577 回答
1

你只需要一个实例OpenGL来调用它。具体来说,你如何做到这一点取决于OpenGL你没有提供的信息,但它看起来像这样:

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

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

于 2013-03-04T15:43:10.213 回答
0

You should create your graphic library object.

std::unique_ptr<GraphicsLibrary> pGL(new OpenGL); //or shared_ptr
pGL->drawText(...);
于 2013-03-04T15:43:31.823 回答