ショッピングモール  Personal Health / Stress ( Aromatherapy )


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.4928

関数ポインタについての質問
投稿者---茂樹(2005/11/24 22:54:07)


初めまして。
お世話になります。

 私は今、関数ポインタを勉強しているのですが、いくつかのサイトで紹介されている、
関数ポインタについての簡単なプログラムすら正常に動作させる事ができなく、途方に暮れています。
そこで、手前勝手で申し訳ないですが、ぜひとも皆さんの力をお借りしたく投稿させて頂きました。
 今試しているプログラムの全文を下記に記します。


<pre>

class test{
private:
  void (*func)(double);   //関数ポインタ
  void a(double);     //内容の無い関数
public:
  /*コンストラクタ*/
  test();
};

/*コンストラクタの実装*/
test::test()
{
  //関数のポインタを格納
  func=a;
}

</pre>

このプログラムを実行しようとすると、

error C2440: '=' : 'void (__thiscall test::* )(double)' から 'void (__cdecl *)(double)' に変換できません。

というエラーが出てしまいます。

お分かりになる方がおられましたらご教授頂きたく思います。
OSはXPで、コンパイラはVC.NETを使っています。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:関数ポインタについての質問 4929 RiSK 2005/11/24 23:02:53
<子記事> Re:関数ポインタについての質問 4932 wiz 2005/11/25 00:41:56


No.4929

Re:関数ポインタについての質問
投稿者---RiSK(2005/11/24 23:02:53)


エラーメッセージを参考に
void (*func)(double); //関数へのポインタ

void (test::*func)(double); // メンバ関数へのポインタ
に修正します。

関数へのポインタとメンバ関数へのポインタは別物です。


この投稿にコメントする

削除パスワード

No.4933

Re:関数ポインタについての質問
投稿者---茂樹(2005/11/25 00:51:46)


素早いお返事ありがとうございます。

 関数ポインタとメンバ関数ポインタは違ったのですね。大きな勘違いをしていました。
鋭いご指摘のおかげで、無事動作させることが出来ました。
 必要ないかも知れないですが、訂正後のプログラムを記しておきます。


class test{
private:
void (test::*func)(double); //関数ポインタ
void a(double); //内容の無い関数

public:
/*コンストラクタ*/
test();

/*関数ポインタの示す関数を実行*/
void TakeFunc(double d);
};


//内容の無い関数の実装
void test::a(double){}

/*コンストラクタの実装*/
test::test()
{
//関数のポインタを格納
func=a;
}

/*TakeFuncの実装*/
void test::TakeFunc(double d)
{
//a(d)と同意
(this->*func)(d);
}


 動作させる為だけのプログラムですので、内容が全く無くてお恥ずかしいです。
これにどんどんと肉付けをして、実用性のあるプログラムにしていきたいと思います。
ご教授頂き、本当にありがとうございました。



この投稿にコメントする

削除パスワード

No.4941

Re:関数ポインタについての質問
投稿者---YuO(2005/11/25 11:06:23)


test::test()
{
    //関数のポインタを格納
    func=a;
}

これではだめです。
test::test()
{
    func = &test::a;
}
と書く必要があります。

Visual Studio.NET 2003では/Zaを付けると警告C4253が出る程度でしたが,
Visual Studio 2005では/ZaなしでもエラーC3867が出ます。


ちなみに,標準規格[ISO/IEC 14882:2003]から。

5.3.1 Unary operators

3 A pointer to member is only formed when an explicit & is used and its operand is a qualified-id not enclosed in parentheses.





この投稿にコメントする

削除パスワード

No.4952

Re:関数ポインタについての質問
投稿者---茂樹(2005/11/26 01:21:45)


返信ありがとうございます。

 ご指摘ありがとうございます。警告が確かに出ていました。
エラーが出なくなったので、解決したと早合点していました。
このまま気付かずにいれば大きなミスをしていたかも知れません。
本当にありがとうございました。


この投稿にコメントする

削除パスワード

No.4932

Re:関数ポインタについての質問
投稿者---wiz(2005/11/25 00:41:56)


内容のない関数っていうのは意味不明ですが。。。
関数ポインタをメンバなどに持つ場合はtypedef とかで型を作ってやる
といいとおもいます
typedef void (*FUNC)(double);

class test{
private:

  FUNC pfunc;
  static void a(double);     //内容の無い関数

public:

  /*コンストラクタ*/
  test();
};
/*コンストラクタの実装*/
test::test()
{
  //関数のポインタを格納


  pfunc=a;
}

void test::a( double )
{

}


っとこんな感じ。。。?
#内容のない関数ってVCとかだと未解決になると思うんですが。。。



この投稿にコメントする

削除パスワード

No.4939

Re:関数ポインタについての質問
投稿者---RAPT(2005/11/25 09:57:58)


>内容のない関数っていうのは意味不明ですが。。。
「何も処理を行なわない」って意味でしょう。

>#内容のない関数ってVCとかだと未解決になると思うんですが。。。
なりません。
宣言のみで定義がリンケージ内に存在しない場合、リンクエラーに
なりますが、今回の場合、スレ主はきちんと関数定義してますし。




この投稿にコメントする

削除パスワード

No.4940

Re:関数ポインタについての質問
投稿者---wiz(2005/11/25 10:16:32)


><pre>>内容のない関数っていうのは意味不明ですが。。。
>「何も処理を行なわない」って意味でしょう。
>#内容のない関数ってVCとかだと未解決になると思うんですが。。。
>なりません。
>宣言のみで定義がリンケージ内に存在しない場合、リンクエラーに
>なりますが、今回の場合、スレ主はきちんと関数定義してますし。

2度目は確かに関数定義されていますが、初回投稿時は、関数定義を
行っていない為、何も処理を行わない=関数定義をしないと思った為です。



この投稿にコメントする

削除パスワード

No.4942

Re:関数ポインタについての質問
投稿者---RAPT(2005/11/25 12:45:48)


>2度目は確かに関数定義されていますが、初回投稿時は、関数定義を
>行っていない為、何も処理を行わない=関数定義をしないと思った為です。

あ、そうですね。投稿時刻を見間違えていたようです。


この投稿にコメントする

削除パスワード

No.4951

Re:関数ポインタについての質問
投稿者---茂樹(2005/11/26 01:15:33)


返信ありがとうございます。

 分かりづらい書き方してすみません。メンバ関数ポインタに格納する為だけの関数でしたので、
プロトタイプだけでも動くかなと思っていて、実際エラーも出ていなかったのですが、
メンバ関数ポインタのエラーを解決できた途端にエラーが出てしまいまい、
実装する事で解決しました。
 ご指摘ありがとうございました。


この投稿にコメントする

削除パスワード

No.4945

Re:関数ポインタについての質問
投稿者---ヮラヮラ(2005/11/25 16:47:16)


>内容のない関数っていうのは意味不明ですが。。。

>#内容のない関数ってVCとかだと未解決になると思うんですが。。。

『内容のない関数』が意味不明なのに、
「『内容のない関数』がVCとかだと未解決になる」
って思えるってところがすごいね。。。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity