EffectiveC++改訂2版 29項〜31項
『第5章 クラスと関数:その実装』だけれども既知の事項で復習をしている感じ。自分自身に蓄積ができつつある感触は悪くないですね。
29項
内部データのハンドル(ポインタ、参照)を返すなということ。第3版では、この手のリソースは専用のハンドルクラス(boost::shared_ptr)を使おうとなっている。
30項
前項に引き続き、内部メンバへのポインタについての話。
メンバ関数へのポインタを返す例が出ているるけれど、宣言、使い方含め十分理解できていないのを自覚した。哀しい。
なので、実際に書いて見るテスト。
#include <iostream> class TestClass { public: TestClass(int d): data(d), fptr(&TestClass::privateShow) { } typedef void (TestClass::*FPTR)(); FPTR getFPTR() { return &TestClass::privateShow; } void (TestClass::*getFuncPtr())() { return &TestClass::privateShow; } void (TestClass::*fptr)(); private: void privateShow(); int data; }; void TestClass::privateShow() { std::cout << "private data = " << data << std::endl; } int main() { TestClass a(100); // 関数へのポインタを保持するメンバ変数を介して呼び出し (a.*(a.fptr))(); // 関数へのポインタを取得し、変数に格納し、その変数を介して呼び出し TestClass::FPTR p = a.getFPTR(); (a.*p)(); // 「メンバ関数へのポインタ」を返すメンバ関数の戻り値を使って呼び出し。 (a.*(a.getFuncPtr()))(); }
参考になるリンクも発見
など。最後のは普通のC言語でのものですが。
31項
前項に類似の内容。
- ローカルオブジェクトへのリファレンス
- 新たにnewで確保したポインタの参照先
はだめ。