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で確保したポインタの参照先

はだめ。