2010-07-13 9 views
5

Gibt es eine Möglichkeit zu erkennen (zum Beispiel mit Compiler-Warnung), wenn Klassen friend deklariert sind, aber nicht auf private Mitglieder zugreifen, dh. Wenn Freundschaft nutzlos ist?Unbenutzte Freund Klasse in C++

+1

Vielleicht können Sie ein Programm mit den Clang-Bibliotheken zusammenhalten? –

Antwort

3

Compilerwarnungen sind nicht standardisiert, dies hängt also von Ihren spezifischen Compilern ab. Ich wäre sehr überrascht, wenn einer von ihnen dies unterstützen würde. Eine ähnliche Situation wäre, wenn Sie eine Funktion für ein öffentliches Mitglied hätten, die nur von anderen öffentlichen Mitgliedern aufgerufen würde (was bedeutet, dass sie nicht öffentlich sein muss), und ich glaube nicht, dass Compiler dies feststellen.

Das Ausführen eines dieser Tests würde zusätzliche Arbeit für die Compiler-Autoren bedeuten, und ich bezweifle, ob sie sie als ausreichend nützlich für die Implementierung sehen würden.

+1

Ich habe Ihr Beispiel von öffentlichen Mitgliedern nicht ganz verstanden, aber ansonsten stimme ich Ihrer Antwort zu. –

+0

@Helltone: Ich denke, er meint, dass wenn eine öffentliche Mitgliederfunktion nur über andere Funktionen derselben Klasse aufgerufen wird, sie überhaupt nicht öffentlich sein muss. – casablanca

2

Nicht, dass ich weiß. Vielleicht gibt es ein Refactoring-Tool da draußen, das es tun kann. Sie können immer versuchen, die Freundschaft zu entfernen und zu sehen, ob sie noch kompiliert, aber das könnte für ein großes Projekt zeitaufwendig sein.

6

Ich weiß nicht, wie dies mit Compiler-Warnungen zu erkennen, aber einem anderen Weg, dies zu tun, um Ihre Klassendefinitionsdatei zu gehen wäre und eine Suche & für friend class mit /*friend*/ class ersetzen und sehen, ob es kompiliert noch. Für ein großes Projekt könnte das natürlich mühsam werden.

+1

Das verursacht eine ziemlich komplexe Änderung in der Semantik. Es wäre ziemlich schwierig, dies in einem Kommentar hier zu erklären, aber im Grunde unterscheidet sich die Namenssuche. – MSalters

+1

@MSalters: Haben Sie einen Link, über den ich lesen kann? Ich bin gespannt, wie sich die Semantik verändert. – Praetorian

0

Sie könnten den Code kompilieren, um zu sehen, dass es kompiliert, dann alle "Freund" -Deklarationen (vielleicht programmgesteuert mit sed) entfernt und sieht, ob es noch kompiliert.

+2

Das folgende Makro ist eine einfache Möglichkeit, "Freund" (und den Rest dieser Codezeile) in einen Kommentar zu verwandeln. Dies funktioniert nicht, wenn die Friend-Deklaration mehrzeilig ist. #define Freund // –