但Helper
朋友是TestBuilder的嵌套類,不是嗎? :)
其結果是,它可以訪問外部類的成員(是的,和它的私有成員),檢查例如:
#include <iostream>
using namespace std;
template<typename Fun, typename Arg>
class TestBuilder
{
int n;
char c;
public:
template<typename Int>
class Helper
{
public:
void print(TestBuilder& tb) {
std::cout << tb.n << " " << tb.c << std::endl;
}
};
TestBuilder(int n, char c) : n(n), c(c) {}
};
int main() {
TestBuilder<int, int> tb(5, 'p');
TestBuilder<int, int>::Helper<int> h;
h.print(tb);
return 0;
}
其中將輸出:
C02QT2UBFVH6-lm:~ gsamaras$ pico main.cpp
C02QT2UBFVH6-lm:~ gsamaras$ g++ -Wall main.cpp
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out
5 p
但是,如果您添加另一個類(不是嵌套的,只是另一個類),它不會訪問(當然!)TestBuilder
的私有成員,請親自看看:
class alienClass
{
public:
/*
That won't work, you will get:
error: 'n' is a private member of 'TestBuilder<int, int>'
error: 'c' is a private member of 'TestBuilder<int, int>'
*/
void print(TestBuilder<int, int>& tb) {
std::cout << tb.n << " " << tb.c << std::endl;
}
};
Helper嵌套在TestBuilder中,它已經有了對任何TestBuilder對象的私有成員的完全訪問權限。 – Davidbrcz