クラス内の関数ポインタ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
bono

クラス内の関数ポインタ

#1

投稿記事 by bono » 12年前

コード:

class Game
{
	~
	//ゲームのタイトル画面
	int GameTitle();
	//メイン関数
	int GameMain();

	//関数ポインタ
	int (Game::*Scene)(){};
};
コンストラクタで
Scene = &Game::Title;

ヘッダーで
Game *game;
メイン関数で
(game->*Scene)();
とすると
error C2065: 'Scene' : 定義されていない識別子です。
とでてコンパイルが通りません。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: クラス内の関数ポインタ

#2

投稿記事 by みけCAT » 12年前

(game->*Scene)();は、(game->Scene)();または(*(game->Scene))();の間違いではないですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

bono

Re: クラス内の関数ポインタ

#3

投稿記事 by bono » 12年前

みけCAT さんが書きました:(game->*Scene)();は、(game->Scene)();または(*(game->Scene))();の間違いではないですか?
(game->Scene)();
error C2064: 0 引数を取り込む関数には評価されません。

(*(game->Scene))();
error C2171: '*' : 'int (__thiscall Game::* )(void)' のオペランドが無効です。
error C2064: 0 引数を取り込む関数には評価されません。
どちらとも無理です。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: クラス内の関数ポインタ

#4

投稿記事 by みけCAT » 12年前

関数ポインタの宣言が怪しいと思います。
Game::Titleの型は何ですか?
関数ポインタの宣言の書き方は、例えばqsortの第四引数が参考になると思います。
苦C さんが書きました:void qsort(void *base, size_t nel, size_t width,
    int(*compar)(const void *x, const void *y));
(http://9cguide.appspot.com/r_lib.html)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

hoge

Re: クラス内の関数ポインタ

#5

投稿記事 by hoge » 12年前

(game->game->*Scene)();で
>int (Game::*Scene)(){};これはコンパイル通るの?{}が余分なような

hoge

Re: クラス内の関数ポインタ

#6

投稿記事 by hoge » 12年前

違った
(game->*game->Scene)();だ。

bono

Re: クラス内の関数ポインタ

#7

投稿記事 by bono » 12年前

hoge さんが書きました:(game->game->*Scene)();で
>int (Game::*Scene)(){};これはコンパイル通るの?{}が余分なような
{}は通らなくて追加したもので、無いと思ってください。
結果は変わりません。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: クラス内の関数ポインタ

#8

投稿記事 by みけCAT » 12年前

この位置で関数ポインタの変数を宣言するのに、Game::はつけなくていいのではないでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

bono

Re: クラス内の関数ポインタ

#9

投稿記事 by bono » 12年前

みけCAT さんが書きました:この位置で関数ポインタの変数を宣言するのに、Game::はつけなくていいのではないでしょうか?
何ですか?

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: クラス内の関数ポインタ

#10

投稿記事 by みけCAT » 12年前

bono さんが書きました:
みけCAT さんが書きました:この位置で関数ポインタの変数を宣言するのに、Game::はつけなくていいのではないでしょうか?
何ですか?
何ですかって何ですか?

日本語わかりますか?
無理をせず、英語で質問してもいいですよ。(投稿には日本語の文字を含めることが必要です)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: クラス内の関数ポインタ

#11

投稿記事 by softya(ソフト屋) » 12年前

とりあえず落ち着いて下さい。
bono さんは、コンパクトにエラーを再現できるコードを投稿してもらうと話が早く進むと思います。
「何ですか?」は「何でですか?」の間違いとだと思いますが、もう少し丁寧な言葉でお願いします。

みけCATさんも、言葉選びは慎重にお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yukihiro

Re: クラス内の関数ポインタ

#12

投稿記事 by yukihiro » 12年前

bono さんが書きました: Scene = &Game::Title;

Scene = &Game::GameTitle;
の誤りでしょう。

回答(というか質問が見当たらないですが)としては
hogeさんが既に出してますね。

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: クラス内の関数ポインタ

#13

投稿記事 by へにっくす » 12年前

とりあえず以下でコンパイルできたが、なんだか気持ち悪いな (^^;

コード:

#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\****>
Gameをnewしてる場合は、hogeさんのでokなはず。
written by へにっくす

アバター
usao
記事: 1892
登録日時: 13年前
連絡を取る:

Re: クラス内の関数ポインタ

#14

投稿記事 by usao » 12年前

文法がどうなってんだ? という混乱時には,
丁寧に括弧を付けるとわかりやすいのではないでしょうか.

コード:

#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;
}
オフトピック
トピックのタイトルのせいか,
やりたいことが 単なる(?)関数ポインタ ではなく,クラスのメンバ関数へのポインタ の話だという点が
みけCATさんにうまく伝わらなかったんじゃないかな.
まぁコードを見れば推測できる範囲だと言えなくもないけど,
やっぱ内容に沿ったタイトルと,きちんとした質問内容を書かないとこういう食い違いが起こるってことですよね.

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: クラス内の関数ポインタ

#15

投稿記事 by みけCAT » 12年前

usao さんが書きました:
オフトピック
トピックのタイトルのせいか,
やりたいことが 単なる(?)関数ポインタ ではなく,クラスのメンバ関数へのポインタ の話だという点が
みけCATさんにうまく伝わらなかったんじゃないかな.
まぁコードを見れば推測できる範囲だと言えなくもないけど,
やっぱ内容に沿ったタイトルと,きちんとした質問内容を書かないとこういう食い違いが起こるってことですよね.
C++をよくわかっていないのに、適当な推論で回答してしまい申し訳ありませんでした。
今度から、このような時はきちんとコンパイルが通ることを確認してから回答するように気をつけたいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: クラス内の関数ポインタ

#16

投稿記事 by かずま » 12年前

へにっくす さんが書きました:とりあえず以下でコンパイルできたが、なんだか気持ち悪いな (^^;

コード:

#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;
}
実行結果

コード:

f2(): v = 11
(p1->*p2->pf_)(); は、(p1->*(p2->pf_))(); と同じで、
p2 は、どのオブジェクトのメンバ変数pf_ かを示し、
p1 は、どのオブジェクトに対してメンバ関数を呼び出すのかを示します。
呼び出されたメンバ関数側では p1 が this になります。

閉鎖

“C言語何でも質問掲示板” へ戻る