こんにちは、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 で呼び出されます。メンバー関数ポインターに格納されている許可に関する情報がいくつかあると思います。誰かがこれを確認 (または否定) し、ボンネットの下の理由を少し説明しますか?
ありがとう、ディ