C++のthisポインタを使わざるを得ない状況というのにはどんなものがあるのでしょうか.もしくは使うと便利な場合というのはあるのでしょうか.
記事をいくつか読んでみましたが,使わなくてもいい場合の例が大半で,いまいちどのような状況で必要になるのかがイメージできていません.
ご回答お待ちしております.
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
C++のthisポインタを使わざるを得ない状況というのにはどんなものがあるのでしょうか.
メソッドの返り値として*this
を返す場合には必要です。
投稿2019/12/10 23:20
総合スコア145963
0
ベストアンサー
ひとつの例ですが、別のクラスのメンバー関数や、C言語のインターフェースを持つコールバック関数などへインスタンスを渡し、その関数内部で当該クラスのメンバー関数を呼び出したりする場合にthis
ポインターを用いるケースがあります。
C++
1#include <iostream> 2 3// C言語のインターフェースを持つ何らかの関数 4void stdc_func(void* param); 5 6class C1 { 7public: 8 void memberf() { 9 std::cout << "C1.memberf()" << std::endl; 10 } 11 12 void run() { 13 std::cout << "C1.run()" << std::endl; 14 15 stdc_func(this); 16 } 17}; 18 19void stdc_func(void* param) { 20 C1* pc = reinterpret_cast<C1*>(param); 21 pc->memberf(); 22} 23 24int main() { 25 C1 c1; 26 c1.run(); 27 28 return 0; 29} 30 31/* 32実行結果: 33$ g++ -Wall t1.cpp -o t1.exe 34 35$ ./t1.exe 36C1.run() 37C1.memberf() 38 39*/
投稿2019/12/11 00:40
総合スコア9254
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ちょっと(?)マニアックな例として、テンプレート派生クラス(Derived<T>
)からテンプレート基底クラス(Base <T>
)のメンバ関数(f
)を呼び出したいとき、this->f
のようにthisポインタを明示する必要があります。
Demo: https://wandbox.org/permlink/SB2IZKM0kpbyon9z
C++
1template<typename T> 2struct Base { 3 void f() {} 4}; 5 6template<typename T> 7struct Derived : Base<T> { 8 void h() 9 { 10 f(); // NG 11 this->f(); // OK 12 } 13}; 14 15int main() 16{ 17 Derived<int>{}.h(); 18}
投稿2019/12/25 08:46
編集2019/12/25 08:47総合スコア6191
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/25 08:49
2019/12/26 06:47 編集
2019/12/26 11:37
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。