In Bezug auf Können Zeiger auf Mitglieder die Zugriffsstufe eines Mitglieds umgehen? Ich würde gerne das Codeschnipsel in dieser Frage verstehen.
Ich füge das Codeschnipsel hier ein.
#include <iostream>
template<typename Tag, typename Tag::type M>
struct Rob {
friend typename Tag::type get(Tag) {
return M;
}
};
// use
struct A {
A(int a):a(a) { }
private:
int a;
};
// tag used to access A::a
struct A_f {
typedef int A::*type;
friend type get(A_f);
};
template struct Rob<A_f, &A::a>;
int main() {
A a(42);
std::cout << "proof: " << a.*get(A_f()) << std::endl;
}
Neben einigen Fragen möchte ich hier eine einzige Frage hervorheben, die vielleicht den Rest aufdeckt.
Ich verstehe die folgende Aussage in der Studie nicht main
Funktion:
a.*get(A_f())
I do verstehen (glaube ich), dass get(A_F())
gibt einen Zeiger auf a.a
. Allerdings verstehe ich nicht die get()
Funktion. In welcher Struktur ist sie tatsächlich definiert? Wie wird auf sie in dieser Struktur zugegriffen?
Ich habe zwei weitere Fragen, die beantwortet werden können, wenn die obige Frage beantwortet ist, aber ich werde sie hier stellen. Erstens, in der Definition von Rob
die friend
Schlüsselwort vor der Funktion verwendet wird get
die sowohl definiert als auch deklariert wird. Ich dachte, dass die friend
Schlüsselwort kann nur vor einer Funktion verwendet werden Erklärung um anzuzeigen, dass eine definierte Funktion anderswo Zugriff auf die privaten/geschützten Mitglieder der Klasse hat. Kann mir das jemand erklären?
Zweitens verstehe ich den Satz nicht template struct Rob<A_f, &A::a>;
. Ich verstehe nicht die Verwendung des template
Stichwort ohne <...>
und ich verstehe nicht, warum es keine Vorlagendefinition gibt - dies scheint eine Art von Vorwärtserklärung zu sein. Kann mir das jemand erklären? Danke!