クラス内のメンバ関数ポインタを外から呼び出したい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
YYSS
記事: 125
登録日時: 9年前
連絡を取る:

クラス内のメンバ関数ポインタを外から呼び出したい

#1

投稿記事 by YYSS » 7年前

メンバ関数ポインタをクラス外から呼びたいのですがエラーになってしまいます。

クラス定義

コード:

class C_test{

private:
	int		m_Count;	//	制御カウント
	
public:
	void	(C_test::*ScreenEvent)();		//	ここに差し替える
	void	NoEvent(){}				//	何もしないときはこいつをいれとく
};
呼ぶとき

コード:

	( LineMaster->*ScreenEvent )();		//	エラー 「定義されていない識別子です。」
	LineMaster->ScreenEvent();		//	エラー 「0 引数を取り込む関数には評価されません。」
調べたところ関数ポインタは、->*、で呼べるというのが分かったのですが、何故エラーになるのかが分かりません。

クラス内なら

コード:

	(this->*ScreenEvent)()		//	エラーなし
で問題なく呼べるのですが、クラス外から呼ぶ場合は、どういう表記にすればいいのでしょうか?

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

Re: クラス内のメンバ関数ポインタを外から呼び出したい

#2

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

そういう設計はしないほうが良いと思いますが。
なぜ、そんな設計にする必要があるかを説明してもらえますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
YYSS
記事: 125
登録日時: 9年前
連絡を取る:

Re: クラス内のメンバ関数ポインタを外から呼び出したい

#3

投稿記事 by YYSS » 7年前

softya(ソフト屋) さんが書きました:そういう設計はしないほうが良いと思いますが。
なぜ、そんな設計にする必要があるかを説明してもらえますか?
ループ内で処理を行う際に、関数ポインタを使えば処理を分岐させる必要が無く、
関数ポインタの中身?関数?を差し替えるだけで処理を変えれるのでスマートになると思っていたのですが・・・

イメージ

コード:

	//分岐が増えると管理しづらい
	switch( select ){
	case 0:	fanc1();
	case 1:	fanc2();
	case 2:	fanc3();
	case 3:	fanc4();
	case 4:	fanc5();
	}

	//理想
	(this->*FancBase)();
	//FancBaseの中身を差し替えるだけで処理を変えれる
1行で済むので、管理がしやすいという思想です。
こういう設計は問題なのでしょうか?

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

Re: クラス内のメンバ関数ポインタを外から呼び出したい

#4

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

外部に公開しているのが問題でしょうね。
外部から直接呼び出せて良いんでしょうか?

(this->*ScreenEvent)()で呼び出すだけのメンバ関数を用意してはどうでしょうか?
あと関数の切り替えも出来れば隠蔽したい所ですが、そこもenum名のswitch文は避けたい所ですね。
ScreenEventの内容を切り替えるだけのメンバ関数も用意したほうが良いでしょうね。面倒ですが。
そすればpublicな関数はすごく減らせると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: クラス内のメンバ関数ポインタを外から呼び出したい

#5

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

YYSS さんが書きました:クラス外から呼ぶ場合は、どういう表記にすればいいのでしょうか?
以下にその説明があります。

ロベールのC++教室
第57章 メンバ関数ポインタ天国


しかし管理しやすいか?と言うと、そうでもないと思いますけどね。
written by へにっくす

アバター
YYSS
記事: 125
登録日時: 9年前
連絡を取る:

Re: クラス内のメンバ関数ポインタを外から呼び出したい

#6

投稿記事 by YYSS » 7年前

へにっくす さんが書きました: しかし管理しやすいか?と言うと、そうでもないと思いますけどね。
そうですね、思い直すと余計ややこしくなってる気がしないでもないです;;
softya(ソフト屋) さんが書きました:外部に公開しているのが問題でしょうね。
外部から直接呼び出せて良いんでしょうか?

(this->*ScreenEvent)()で呼び出すだけのメンバ関数を用意してはどうでしょうか?
あと関数の切り替えも出来れば隠蔽したい所ですが、そこもenum名のswitch文は避けたい所ですね。
ScreenEventの内容を切り替えるだけのメンバ関数も用意したほうが良いでしょうね。面倒ですが。
そすればpublicな関数はすごく減らせると思います。
メンバ変数はPrivate、メンバ関数はPublicという、変な常識に囚われていました;;
PriveteとPublicの関数をうまく分けて、Publicな関数をスッキリさせたいと思います。


お二方とも、返答ありがとうございました。

閉鎖

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