長い間遅れることなく、ここで、なぜそれが何をするのか見当がつかないコードを示します。
#include <iostream>
class A {
private:
void print() { std::cout << "A.print() called" << std::endl; };
public:
template<typename Foo>
class B; //NOTE: no friend!
public:
A();
B<double>* bd;
B<int>* bi;
};
template<typename Foo>
class A::B{
A* callback;
public:
B(A* a):callback(a){};
void print() { callback->print(); }; // Why is this working ???
};
A::A():bd(new B<double>(this)),bi(new B<int>(this)){}
int main(int argc, char **argv)
{
A a;
// a.print(); // error: ‘void A::print()’ is private
a.bd->print();
a.bi->print();
A::B<char> c(&a);
c.print();
A::B<double> d = *a.bd;
d.print();
return 0;
}
さて、それはこの出力を作成します:
A.print() called
A.print() called
A.print() called
A.print() called
しかし、なぜ?
バックグラウンド
sに関係する問題に遭遇したとき、私は最初にうさぎの穴を下る旅を始めましたfriend
。だから私は、前方宣言ではなく友人宣言を読みました(そして、言及された答えはこことここにあります)。そのため、簡単な例 (上記の結果) を設定しようとしているときに、実際にはまったく必要ないように思われることがわかりましたfriend
。
質問
結論の質問は次のとおりです:のインスタンスがのプライベート関数にアクセスできるのはなぜですか? A::B
A
A::print()
(ただし、自分の子供が何であるかを誤解している可能性があることは認識しています-ベースと派生ではなく子供です)