1

こんにちは、C++ メンバー関数の権限について質問があります。

例 1

class Test {
    private:
    void func() { cout << "test" << endl; }
};

void weird_func(Test* t, void (Test::*f)()) {
    (t->*f)();
}

int main() {
    Test t;
    weird_func(&t, &Test::func);
}

これはうまくいきません

test1.cc: In function ‘int main()’:
test1.cc:10:10: error: ‘void Test::func()’ is private
test1.cc:19:26: error: within this context

ただし、別の例が機能します

class Test {
    public:
    void helper(Test* ptr);
    private:
    void func() { cout << "test" << endl; }
};

void weird_func(Test* t, void (Test::*f)()) {
    (t->*f)();
}

void Test::helper(Test* ptr) {
    weird_func(ptr, &Test::func);
}

int main() {
    Test t;
    t.helper(&t);
}

2番目の例が機能する理由がよくわかりません。唯一の違いは、ヘルパー機能があることです。Test::func は、クラス Test のメンバーではない、両方の例で、bird_func で呼び出されます。メンバー関数ポインターに格納されている許可に関する情報がいくつかあると思います。誰かがこれを確認 (または否定) し、ボンネットの下の理由を少し説明しますか?

ありがとう、ディ

4

1 に答える 1

3

::helper はプライベート関数にアクセスできるため、アドレス指定できます。この場合、アドレスを別の関数に渡します。関数ポインターとして参照されると、クラス属性へのポインターと同じように渡すことができます。間違った手には危険です:)。

于 2013-07-21T05:24:43.183 に答える