首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++接口错误,非静态成员引用必须相对于特定对象。

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

Stack Overflow用户
提问于 2013-03-04 15:41:19
回答 3查看 1.7K关注 0票数 2

我有一个接口,但我不能使用它,因为方法应该是静态的。或者另一个解决方案..。据我所见,它们不可能是静止的.

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

代码语言:javascript
复制
GraphicsLibrary.h
    virtual void drawText(const std::string& text, const Point& pt, unsigned char r, unsigned char g, unsigned char b);

这里要说明的是,OpenGL是从GraphicsLibrary派生出来的:

代码语言:javascript
复制
OpenGL.h
class OpenGL : public GraphicsLibrary

OpenGL.cpp使用来自GraphicsLibrary的虚拟函数,并在括号中“做”事情:

代码语言:javascript
复制
OpenGL.cpp 
void GraphicsLibrary::drawText(const std::string& text, const Point &pt, unsigned char r, unsigned char g, unsigned char b)
{
//does things
}

我主要是用这个方法..。但它给出了一个错误

代码语言:javascript
复制
MyMain
OpenGL::drawText(toString(mousePos_world), drawPosition, 255, 0, 0);

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

我该如何解决这个问题?我读到我应该把这个函数变成静态的,但是我觉得我不能.对吗?或者大多数人会说,想想为什么要用其他类的方法来构造类,但这是因为我有一个接口…!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-04 15:42:53

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

代码语言:javascript
复制
OpenGL ogl;
ogl.drawText(...);

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

然后,在这个对象上,您可以调用函数。

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

票数 4
EN

Stack Overflow用户

发布于 2013-03-04 15:43:10

您只需要一个OpenGL实例就可以调用它。具体而言,如何做到这一点取决于尚未给出的关于OpenGL的信息,但如下所示:

代码语言:javascript
复制
OpenGL gl;
gl.drawText(toString(mousePos_world), drawPosition, 255, 0, 0);

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

票数 1
EN

Stack Overflow用户

发布于 2013-03-04 15:43:31

您应该创建图形库对象。

代码语言:javascript
复制
std::unique_ptr<GraphicsLibrary> pGL(new OpenGL); //or shared_ptr
pGL->drawText(...);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15205302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档