2013-03-04 73 views
2

我有一個接口,但我不能使用它,因爲方法應該是靜態的......或另一種解決方案......就我所見不能是靜態的...:C++接口錯誤,非靜態成員引用必須是相對於特定對象

有它使用的函數的定義的圖形庫:是從GraphicsLibrary衍生

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

這裏只是要清楚,OpenGL的:

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 
} 

然後是IM我主我使用的方法...但它給出了一個錯誤

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

錯誤:非靜態成員引用必須是相對於特定對象


我應該如何解決這個問題?我讀過,我應該使這個功能是靜態的,但我認爲我不能......對嗎?或者大多數人都這麼說,想想爲什麼用這種方式構建類,以便使用其他類的方法,但那是因爲我有一個接口...!

回答

4

您需要創建OpenGL類的一個實例:

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

你的功能drawText是類,這意味着它有一個類的對象上調用的成員函數。一個對象是特定類的一個實例。

然後在那個對象上,你可以調用你的函數。

如果你不希望創建一個實例,那麼你應該讓你的函數static,據此你可以調用它像這樣:OpenGL::drawText(...);

1

你只需要的OpenGL一個實例來調用它。具體來說,你如何做到這一點取決於有關OpenGL你沒有給,但它會是這個樣子:

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

您試圖撥打drawText,就好像是一個靜態成員函數(使用::) 。由於drawText不是靜態的,你需要一個對象來調用它。

0

您應該創建圖形庫對象。

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