class Game
{
~
//ゲームのタイトル画面
int GameTitle();
//メイン関数
int GameMain();
//関数ポインタ
int (Game::*Scene)(){};
};
Scene = &Game::Title;
ヘッダーで
Game *game;
メイン関数で
(game->*Scene)();
とすると
error C2065: 'Scene' : 定義されていない識別子です。
とでてコンパイルが通りません。
(game->Scene)();みけCAT さんが書きました:(game->*Scene)();は、(game->Scene)();または(*(game->Scene))();の間違いではないですか?
(http://9cguide.appspot.com/r_lib.html)苦C さんが書きました:void qsort(void *base, size_t nel, size_t width,
int(*compar)(const void *x, const void *y));
{}は通らなくて追加したもので、無いと思ってください。hoge さんが書きました:(game->game->*Scene)();で
>int (Game::*Scene)(){};これはコンパイル通るの?{}が余分なような
何ですかって何ですか?bono さんが書きました:何ですか?みけCAT さんが書きました:この位置で関数ポインタの変数を宣言するのに、Game::はつけなくていいのではないでしょうか?
はbono さんが書きました: Scene = &Game::Title;
#include <iostream>
using namespace std;
class Game
{
public:
Game();
//ゲームのタイトル画面
int GameTitle();
//メイン関数
int GameMain();
//関数ポインタ
int (Game::*Scene)();
};
Game::Game()
{
Scene = &Game::GameTitle;
}
int Game::GameTitle()
{
cout << "GameTitle";
return 0;
}
void main(void)
{
Game game;
(game.*game.Scene)();
}C:\Users\****>cl /EHsc 1.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 17.00.61030 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
1.cpp
Microsoft (R) Incremental Linker Version 11.00.61030.0
Copyright (C) Microsoft Corporation. All rights reserved.
/out:1.exe
1.obj
C:\Users\****>1
GameTitle
C:\Users\****>#include <iostream>
class Game
{
public:
Game::Game(){ Scene=&Game::GameTitle; }
int GameTitle(){ std::cout << "title" << std::endl; return 1; }
int ( Game::*Scene )(); //メンバ関数ポインタ
};
int main( int argc, char **argv )
{
Game *game = new Game;
//(1) game->Scene がメンバ関数ポインタ.
//(2) それをコールするための演算子->* を使うと
// ( Game型インスタンスへのポインタ->*( game->Scene ) )();
//(3) 呼び出すGameインスタンス(へのポインタ)がここではgameなので
// ( game->*( game->Scene ) )();
( game->*( game->Scene ) )();
delete game;
std::cin.ignore();
return 0;
}
C++をよくわかっていないのに、適当な推論で回答してしまい申し訳ありませんでした。usao さんが書きました:オフトピックトピックのタイトルのせいか,
やりたいことが 単なる(?)関数ポインタ ではなく,クラスのメンバ関数へのポインタ の話だという点が
みけCATさんにうまく伝わらなかったんじゃないかな.
まぁコードを見れば推測できる範囲だと言えなくもないけど,
やっぱ内容に沿ったタイトルと,きちんとした質問内容を書かないとこういう食い違いが起こるってことですよね.
へにっくす さんが書きました:とりあえず以下でコンパイルできたが、なんだか気持ち悪いな (^^;
#include <iostream>
class A {
public:
A(int (A::*pf)(), int v); // コンストラクタ
int f1(); // メンバ関数
int f2(); // メンバ関数
int (A::*pf_)(); // メンバ変数
int v_; // メンバ変数
};
A::A(int (A::*pf)(), int v) : pf_(pf), v_(v) { }
int A::f1() { std::cout << "f1(): v = " << v_ << std::endl; }
int A::f2() { std::cout << "f2(): v = " << v_ << std::endl; }
int main()
{
A *p1 = new A(&A::f1, 11);
A *p2 = new A(&A::f2, 22);
(p1->*p2->pf_)();
delete p2;
delete p1;
}