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

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

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

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

Q&A

解決済

2回答

808閲覧

c++ クラス内関数ポインタ変数をusingを使って作成できない原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2019/04/17 10:45

testクラス部の以下コード部ですがコメント部のusingを使わない宣言方法ではエラーにならないのですが
なぜusingを使うとエラーになるのでしょうか? &を使ってくださいとのエラーが出るのですが&をつけたりその他思い当たるコード編集を行いましたがエラーが取れません自分の勘では”そもそもできない”(コメント部はエラーにならないので)のではと思うのでですがその辺はどうなのでしょうか?原因を教えてくれますでしょうか?

//void(test::*t)() = &test::print; tp *t = &test::print;//1
#include <iostream> #include "conio.h" using namespace std; using tp = void(*)(); class v { }; class test { int a; public: test():a(0){ } void print() { cout << a << endl; } //void(test::*t)() = &test::print; tp *t = &test::print;//1 void f2(int x) { a = x; } virtual void vf() { cout << "仮想関数\n"; } void ft() { cout << "test()\n"; } // virtual void vf2() = 0;//純枠仮想関数 protected: void pf() { cout << "protected\n"; } }; class sample : public test { int a; public: void fx() { pf(); } void fs() { cout << "sample()\n"; } sample():a(0) { } void vf() { cout << "派生関数\n"; } void print() { cout << a<<endl; } void f2(int x) { a = x; } virtual void vf2() { cout << "純枠仮想関数\n"; } }; void f3() { } int main() { test *sa = new test(); sa->vf(); //sa->vf2(); sa->f2(3); sa->print(); delete sa; sa = new sample(); sa->ft(); sa->print(); sa->f2(7); test* sb = (test*)sa; sb = (sample*)sb; //tp t = f3; //tp t = sa->print;//2 sb->print(); //sb->vf(); // sb->vf2(); int _r = _getch(); return 0; }

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

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

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

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

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

guest

回答2

0

tp *t = &test::print;//1

test::printの型はvoid (test::*)()であってvoid (*)()ではありません

virtual void vf2() = 0;

pure virtual functionを持つクラスはabstruct classと呼ばれ、newできません

あとデストラクタがvirtualではないのでUndefined Behaviorですね。

投稿2019/04/17 12:13

yumetodo

総合スコア5850

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

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

0

ベストアンサー

これで通るじゃろ。

C++

1#include <iostream> 2#include "conio.h" 3using namespace std; 4 5class test; 6using tp = void(test::*)(); 7... 8tp t = &test::print;

[追記]

C++

1#include <iostream> 2class test; 3using tp = void(test::*)(); 4 5class test { 6public: 7 test() { t = &test::print; } 8 void print() { std::cout << "test::print\n"; } 9 tp t; 10}; 11 12int main() { 13 test a; 14 tp x = a.t; 15 (a.*(x))(); 16}

[追記2]

C++

1#include <iostream> 2 3class test { 4public: 5 using tp = void(test::*)(); 6 test() { t = &test::print; } 7 void print() { std::cout << "test::print\n"; } 8 tp t; 9}; 10 11int main() { 12 test a; 13 test::tp x = a.t; 14 (a.*(x))(); 15}

投稿2019/04/17 12:17

編集2019/04/20 13:31
episteme

総合スコア16614

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

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

退会済みユーザー

退会済みユーザー

2019/04/20 13:06

質問ですが &でエラーが出ます「型 "int (base::*)(int a, int b)" の値を使用して型 "tp *" のエンティティを初期化することはできませ」 なぜでなのでしょうか?修正方法を教えてくれますでしょうか?
退会済みユーザー

退会済みユーザー

2019/04/20 13:19

上の質問は自己解決しました。質問ですがusingはそのクラス内に書いた場合その場所しかスコープが効かないということでしょうか?Mainでも使いたいなら同じものを外に書かないといけないのでしょうか?
episteme

2019/04/20 13:31 編集

なに言ってるかわからん。 [追記2] で満足か?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問