Wie mache ich aus einer Bibliothek einen Freund meiner Klasse?

8

Siehe mein erster Versuch, dies zu beantworten . Ich habe es versäumt, die ganze Geschichte vorher zu erzählen, um die Dinge zu vereinfachen. Stellt sich heraus mein Beispiel funktioniert! Entschuldigung.

Die ganze Geschichte ist, dass dies eine Bibliothek ist, die eine Klasse in einer Datei und die Hauptdatei in einer anderen Datei enthält, die alle in meine Bibliothek eingebunden sind. Die Bibliothek stellt die Grundlage für ein Prozess-Framework dar, weshalb der Hauptteil in der Bibliothek und nicht im Prozess liegt.

Unten ist eine abgespeckte Version von dem, was ich habe.

pf.hpp

%Vor%

pf.cpp

%Vor%

pfmain.cpp

%Vor%

Beachten Sie, dass dies beim Kompilieren der Bibliothek fehlschlägt.

Was ich versucht habe, ist:

  • Den Freund überallhin bewegen
  • Der Freund wird auf den globalen Geltungsbereich der Hauptverwendung (z. B. :: main)
  • verwiesen
  • Die Erstellung von Freundschafts- und Hauptdeklarationen erfolgt über den globalen Gültigkeitsbereich

Was vermisse ich?

Danke!

    
Jaime 23.12.2011, 18:18
quelle

4 Antworten

9

Deklarieren Sie einfach die Hauptdatei außerhalb von MyNamespace und geben Sie den globalen Namespace :: in der friend-Anweisung

an %Vor%     
parapura rajkumar 23.12.2011, 18:23
quelle
2

@parapura hat eine Lösung bereitgestellt, erklärt aber nicht warum Sie zuerst main im globalen Gültigkeitsbereich deklarieren müssen.

§7.3.1.2 [namespace.memdef] p3

  

[...] Wenn eine friend -Deklaration in einer nichtlokalen Klasse zuerst eine Klasse oder Funktion deklariert, ist die Friend-Klasse oder -Funktion ein Member des innersten einschließenden Namespace. [...]

In diesem Sinne würde Ihr Code ungefähr so ​​aussehen:

%Vor%

Jetzt sollte es klar sein, warum die globale main Funktion nicht dein Freund war.

    
Xeo 23.12.2011 20:20
quelle
0

Eine allgemeine Antwort könnte darin bestehen, eine "Anwendungs" -Singleton-Klasse bereitzustellen, wie z.B. QApplication in Qt, und reduzieren Sie Ihre main auf etwas wie

%Vor%

Dann reduzierst du dein Freundschaftsinteresse auf class YourApplication gegenüber deinen anderen Klassen und du weißt, wie das geht.

    
Basile Starynkevitch 23.12.2011 18:24
quelle
0

Ich glaube nicht, dass Sie wirklich tun wollen, was Sie tun. Das scheint wirklich ein Hack- und Designproblem zu sein. Wenn Sie die Interna Ihrer Klasse wirklich unter bestimmten Umständen offen legen wollen, könnten Sie eine Accessor-Klasse erstellen, die ebenfalls in Ihrer Bibliothek definiert ist.

So etwas könnte funktionieren (möglicherweise müssen Vorwärtsdeklarationen usw. verwendet werden - dies ist nur ein Anfangspunkt):

%Vor%     
bobbymcr 23.12.2011 18:30
quelle

Tags und Links