Geben Sie eine Memberfunktion der Klasse als friend einer anderen Klasse?
Entsprechend der C++ Primer Buch, der Autor erwähnt, dass Wir angeben können, eine Memberfunktion der Klasse als friend einer anderen Klasse, statt für die gesamte Klasse (Seite 634).
Dann, getestet habe ich diesen code:
class A
{
public:
friend void B::fB(A& a);
void fA(){}
};
class B
{
public:
void fB(A& a){};
void fB2(A& a){};
};
Wollte ich nur die fB() zum Freund der Klasse Ein, nicht die gesamte Klasse B. Aber das über code erzeugt einen Fehler: 'B' : is not a class or namespace name
.
(Ich benutze Visual C++ 2005)
InformationsquelleAutor der Frage ipkiss | 2012-05-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie, die B definition vor:
A
muss die vollständige definition desB
. AllerdingsB
muss wissen, überA
muss aber nicht die vollständige definition, so müssen Sie die forward-Deklaration derA
.InformationsquelleAutor der Antwort juanchopanza
Damit dies funktioniert, wird die vollständige definition
B
muss bekannt sein, bevor die definition vonA
.Also vorwärts deklarieren
A
daB
muss nicht die volle Art, und schalten Sie die Definitionen rund um:InformationsquelleAutor der Antwort Luchian Grigore
Wenn der compiler liest den code( Regel von oben ) und auf dieser Linie:
friend void B::fB(A& a);
Dann compiler versteht nicht, was meinst du damit
B::
. Auch wenn Sie definiert haben, in dieser Klasse später in den code, aber der compiler weiß das nicht. So ist es in der Regel eine gute Praxis zu tun forward-Deklaration der Klasse (class Name;
), wenn die definition befindet sich später im code.InformationsquelleAutor der Antwort AbhimanyuAryan
Wann startet der compiler zum kompilieren des Codes( meist von oben ) und auf dieser Linie:
durch vorwärts-Deklaration class B, compiler kennt Typ B ist die Klasse im Vorfeld auf die eigentliche Erklärung mit allen Mitgliedern.
führen Sie folgenden code nach dem forward-Deklaration der Klasse B.
///////////////
Immer noch Fehler !!!
weil vorwärts-Deklaration ist nur eine Deklaration eines Bezeichners, für die die Programmierer noch keine vollständige definition. also compiler muss die vollständige definition von B vor der Klasse A.
Hinweis: die Klasse Eine definition je nach Art von B und auch die definition von B (ich.e B::fB), so dass die vorwärts-Deklaration allein nicht lösen können, vollständige definition der Klasse B benötigt, um zu definieren, bevor die Klasse A.
4 führen Sie diesen code
////////
Immer noch Fehler !!!
weil class B member-Funktionen der fB & fB2 mit Argumenten vom Typ A aber der compiler hat keine Ahnung über die Art info, die so durch die forward-Deklaration der Klasse A ist, können wir lassen compiler kennt Typ info von A.
Hinweis: Klasse B definition nur abhängig vom Typ Eines nicht-Mitglieder Ein, so dass vorwärts-Deklaration Einer Behebung Schritt 4.
////////////////////////
6 Übung:
InformationsquelleAutor der Antwort SrinivasPaladugu
Erstens forward-deklarieren Sie Eine Klasse, so dass Sie seine visible-Klasse-B-definition. dann definieren Sie Eine Klasse mit einer friend-Funktion der Klasse B.
InformationsquelleAutor der Antwort abdul rizwan
Zuerst von allen, bevor mit einer bestimmten class-Namen müssen Sie erklären Sie zuerst. So benötigen Sie eine forward-Deklaration der Klasse B, wie Sie es in der Klasse Ein, bevor die Klasse B wurde ursprünglich deklariert.
Zweitens müssen Sie zum definieren der Funktionen, (die Verwendung von Variablen sowohl aus der Klassen - hier die Freund-Funktionen ) aus, nachdem die Klassen definiert wurden. Oder sonst vor Fehlern.
Beispielsweise
Wird uns zeigen, Fehler als put_bata versucht, auf roll-und id, bevor Sie definiert sind, auch wenn wir eine forward-Deklaration der Klasse, aber die unten angegebenen code wird nur funktionieren.
InformationsquelleAutor der Antwort New_Bee
@juanchopanza
@ipkiss
Im Hinblick auf das problem, dass Sie keinen Zugriff auf die Daten der Mitglieder Einer innen-fB(A& a), denn A ist noch nicht definiert. Statt es zu definieren und in einer separaten Datei, einschließlich der it, können Sie einfach definieren Sie die Funktion fB(A& a) nach der definition der Klasse A, so dass fB(A& a) ist in der Lage, um zu sehen, Daten-Mitglieder von A.
InformationsquelleAutor der Antwort mrboieng