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

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

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

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

Q&A

解決済

2回答

754閲覧

c++ 関数ポインタでクラスのメンバ関数ポインタ変数にアドレスを設定したい。そもそもできるのか?

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2019/04/03 07:39

関数ポインタで普通の関数とクラスのメンバ関数の中で関数ポインタを作る方法はわかったのですが
クラス内のメンバ変数に関数ポインタ変数を用意してそこにアドレスを格納する方法を知りたいです調べても記事が見つからないのですがそもそもできるのでしょうか?

c#

1#include <iostream> 2#include "conio.h" 3#include <math.h> 4using namespace std; 5 6class test { 7public: 8 9 int add(int a, int b) 10 { 11 return a + b; 12 } 13 14 void f(); 15 16 int(*fx)(int a,int b); 17}; 18 19void test::f() 20{ 21 int (test::*fp)(int a,int b) = &test::add; 22 int x = (this->*fp)(1,2); 23 printf("%d",x); 24 25} 26 27 28void f() 29{ 30 printf(""); 31} 32 33int main() 34{ 35 test t; 36 t.f(); 37 38 39 40 41 _getch(); 42 return 0; 43} 44 45

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

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

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

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

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

guest

回答2

0

ベストアンサー

自己解決しました。

int main() { test *t = new test(); t->fx = f; (*t->fx)(); _getch(); return 0; }

投稿2019/04/03 08:06

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

できてるようですが?

text

1usr ~/Project/test % ./a.out 23 3usr ~/Project/test % cat tst.cpp 4#include <iostream> 5#include <math.h> 6using namespace std; 7 8class test { 9public: 10 11 int add(int a, int b) 12 { 13 return a + b; 14 } 15 16 void f(); 17 18 int(*fx)(int a,int b); 19}; 20 21void test::f() 22{ 23 int (test::*fp)(int a,int b) = &test::add; 24 int x = (this->*fp)(1,2); 25 printf("%d",x); 26 27} 28 29int main() 30{ 31 test t; 32 t.f(); 33 34 getchar(); 35 return 0; 36} 37 38usr ~/Project/test %

Windows環境依存の記述はやめましょう。この↓エラーは消しました。

text

1tst.cpp:2:10: fatal error: 'conio.h' file not found 2#include "conio.h" 3

投稿2019/04/03 07:51

cateye

総合スコア6851

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

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

cateye

2019/04/03 07:54 編集

・・・#include <math.h>も不要ですね
asm

2019/04/08 22:02

> Windows環境依存の記述はやめましょう。 環境依存でも、環境を明記すればよいと思いますが。 それともLinux側に対してもfork使うなとかいいだすのでしょうか?
cateye

2019/04/09 10:00

いや、プログラムを移植したことがなければいいです。
asm

2019/04/09 10:24

なにがいいのでしょうか? 「俺の環境で動かないソースで質問するな」としか読めません。
cateye

2019/04/09 10:53 編集

基本的にソースは複数のコンパイラを通します。なので、gcc,clang古くはbcc、lsi-c等でワーニング(理由が分かるワーニングは理由を記述)が出なくなるまでコンパイル&テストします。・・・少なくとも私の仕事場(組み込み)ではそうでした。そのおかげて30年前のプログラムが改変はされてはいますがまだ動いています。もちろん組み込みですからコンソール入出力なんか無いです・・・・DBとNET関係ぐらいかな?
cateye

2019/04/09 11:03

何もVSがだめだと言っているのではありません。Windowsのアプリケーションを作る時は私も使いました(ボーランドが多かった気がしますが)。ただ、普通のソースにVSやVCでしかコンパイルできないコードを載せるのはどうか? ・・・と、言っているのです。
asm

2019/04/09 12:14

> ただ、普通のソースにVSやVCでしかコンパイルできないコードを載せるのはどうか? 文法上の拡張機能等は使われていないので、 適切に_getch関数を与えてやればgcc/clangでもコンパイルは可能・・・ というかgcc version 7.3.0 (Rev2, Built by MSYS2 project)にて無編集でコンパイルできています。 脱線したような気がしましたが自分が言いたいのは > https://teratail.com/questions/182725 > cateye 2019/04/03 20:42 > 前の質問でも言いましたが、VC固有の関数等(scanf_s(),_getch())使わないでほしいです。Linuxの C(gcc,clang)ではコンパイルできません。 これはあなたのワガママであって、質問者に強要するのは違うんじゃないかなぁと意見させていただきました。
cateye

2019/04/09 12:33

ごめんなさい、誤解が有るようです。 「使わないでほしい」は「使うな」ではありません。ただこのような場所で。質問する時は不特定多数の回答者の環境が有ると思うので、(Windowsユーザが多いのは分かっていますが、他にもMAC等のOSがあるわけですから)そういったコンパイル環境でコンパイルできないソースは、検証して下さる方に余計な労力を払わせるものだと思うのです。まぁ、そういった方が「これはVCだから確認しなくていいや」もしくは「ソース直したよ」ということでいいのならいいのですが?
asm

2019/04/09 13:49

なるほど、お考えは理解できました。 (質問者が基本的に欲しいのは「質問者の環境で動作する回答」なのでは? や  無用なハードルなのではないだろうか? と考えてしまいます。) とはいえ自分も、もしclangのBlocks拡張なんて使われたらお手上げですが。
cateye

2019/04/09 14:34

「質問者の環境で動作する回答」・・・了解です、・・・・以後気をつけえます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問