質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

2回答

2316閲覧

C++で返り値なしの関数ポインタが使えない。

kuniatsu

総合スコア141

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2016/04/13 04:42

環境はfreeのvisualstudioを使用しています。
以下のプログラムは返り値のあるメソッドとないメソッドの2つのメソッドを持っているクラスを作成し、双方に関数ポインタでの実行をさせています。
返り値の設定されている関数は問題なく動くのですが、返り値がないメソッドはポインタ変数にアドレスを代入する部分でエラーが出てしまいます。

なぜエラーがでるのでしょうか?
また、返り値のないメソッドの関数ポインタを扱うにはどのようにしたらよいのでしょうか?

#include "stdafx.h"
#include <iostream>
using namespace std;

class MyClass{
int x;
public:
MyClass() : x(100){}
int a();
void b();
};

int MyClass::a() {
cout << "a()" << endl;
return 0;
}
void MyClass::b() {//返り値なし
cout << "b()" << endl;
}

void main()
{
MyClass mc;

//メンバ関数用のポインタ int (MyClass::*ptr1)(); int (MyClass::*ptr2)(); //ポインタ変数に関数のアドレスを代入 ptr1 = &MyClass::a; ptr2 = &MyClass::b;//※エラーがでる //メソッドを実行 (mc.*ptr1)(); (mc.*ptr2)();

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

int (MyClass::*ptr2)();

エラーの理由は HiroshiWatanabe さんの回答の通りで、intではなくvoidにしないといけません。メソッドの戻り値の型を最初に記述します。

関数ポインタを変数にするときは少し特殊な書き方になってしまうため、戸惑ってしまいますね。そこで、autoで変数を定義する方法が便利です。C++11ではautoの機能が変更され、右辺値の型に合わせて自動で変数の型を決めてくれるという便利な仕組みが使えるようになっています。

このような感じに書けます。

C++

1auto ptr1 = &MyClass::a; 2auto ptr2 = &MyClass::b;

また、変数名にマウスカーソルを合わせるとIntelliSenseで実際にどのように定義されたかが判るので、それを真似して書くという手もあります。

投稿2016/04/13 05:35

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chironian

2016/04/13 05:41

おお、IntelliSenseにそのような使い方があるのですか。良いことを聞きました。ありがとう。autoの型を書き下したい時(変数だけ先に定義したい時)、いつもはまってました。
guest

0

int (MyClass::*ptr2)();
とint型で定義しているのにvoidを代入しようとしているからではないですか?
void型で宣言しておけば解決しませんか?

投稿2016/04/13 04:45

HiroshiWatanabe

総合スコア2160

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問