ここから本文です

とあるC++プログラミングのエラーについて教えてください!

yap********さん

2010/12/1423:29:33

とあるC++プログラミングのエラーについて教えてください!

「::drawLines': 関数呼び出しには引数リストがありません。メンバへのポインタを作成するために '&cdisplay::drawLines' を使用してください」というエラーがでたので、その通りにメンバ関数の前に&をつけてみたら、「error C2276: '&' : 仮想関数のアドレスを取ろうとしました。」というエラーになり、どう解決すればよいものか、わかりません。

何が問題なのでしょうか?



ソースを以下に記します。

//OpenGL,GLUT
#include <GL/glut.h>
#include <GL/gl.h>

class cdisplay{
public:
cdisplay(){glClear(GL_COLOR_BUFFER_BIT);}
~cdisplay(){glFlush();}
void drawLines(void);
};

void cdisplay::drawLines(void){
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_LINES);
glVertex2f(-0.9, 0.9);
glVertex2f(-0.6, 0.6);
glVertex2f(-0.6, 0.9);
glVertex2f(-0.9, 0.6);
glEnd();
}

int main(int argc,char *argv[]){
cdisplay *display=new cdisplay;

glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB);
glutInitWindowSize(640,480);
glutCreateWindow("displayLines");
glutDisplayFunc(display->drawLines); // ←ここでエラーがでました
glutMainLoop();

return 0;
}

補足display->drawLines()にしても、エラー内容は変わりませんでした。


ちなみに、このプログラムはOpenGLライブラリを使って、ウィンドウに×印を描画するものです。
環境はwin7x86, core2duo, VC++2008Expressです。

閲覧数:
4,470
回答数:
2

違反報告

ベストアンサーに選ばれた回答

yur********さん

2010/12/1505:19:48

glutDisplayFunc()はコールバック関数の登録であり、スタティックでないメンバ関数をコールバックとして渡すことができません。
なので、cdisplayクラスで、
static void drawLines(void);
とする(またはグローバル関数に変更)必要があります。

----------------
staticをつけたとしても、描画はされないはずです。
cdisplayクラスのコンストラクタでglClear()、デストラクタでglFlush()を行っていて、ウィンドウを初期化する前にコンストラクタでglClear()をすることにも疑問がありますが、描画実行中に変数displayのデストラクタが呼び出されないので、drawLines()の描画命令が実行されません。

質問した人からのコメント

2010/12/16 01:13:19

降参 ご回答をもとにC/C++の基礎を勉強して書きなおしたら、動作しました!ありがとうございます!!!

ベストアンサー以外の回答

1〜1件/1件中

pas********さん

2010/12/1500:19:21

>glutDisplayFunc(display->drawLines); // ←ここでエラーがでました
display->drawLines()でもだめですか。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる