private statische member-Funktion oder die Kostenlose Funktion in anonymen namespace?
Ich habe mir vor kurzem eine änderung vorgenommen, die stilistisch und wollte sehen, wie andere c++ - Programmierer darüber dachte und ob es irgendwelche Nachteile.
Im wesentlichen, wenn ich brauchte eine utility-Funktion, die nicht brauchen, den Zugang zu einer bestimmten Klasse, was ich zu tun, war etwas wie:
- Datei.h
class A {
public:
//public interface
private:
static int some_function(int);
};
file.cpp
int A::some_function(int) {
//...
}
Aber mehr vor kurzem, ich habe lieber etwas mehr machen wie diese:
file.cpp
namespace {
int some_function(int) {
}
}
//the rest of file.cpp
Hier mein Gedankengang:
- es ist weniger eine Datei Bearbeiten
- einfach mit der Funktion aufgeführt werden, die in der header-Datei kann der Hinweis auf Implementierungsdetails
die haben nicht ausgesetzt werden müssen (auch wenn Sie nicht öffentlich verfügbar). - wenn der Prototyp der Funktion ändern muss, nur eine Datei neu kompiliert werden muss.
Der Letzte ist der überzeugendste für mich. Also meine Frage ist: gibt es irgendwelche Nachteile dadurch?
Sind Sie funktional für die meisten Zwecke, die ich mir denken kann. Es scheint mir, dass ein private static
Funktion können fast immer konvertiert werden, um eine freie Funktion in einem anonymen namespace
.
BEARBEITEN: Eine Sache, die mir einfällt, ist, dass ein private static
hätte, würde die Funktion haben, den Zugang zu private
Mitglieder, wenn da ein Zeiger auf ein Objekt zu arbeiten, aber wenn das der Fall ist, warum nicht machen es zu einem nicht-static
Mitglied?
Was denken Sie?
- Ich auch Recht Häufig. Es ist weniger Aufwand, und ich finde es sauberer. Für private Mitglieder, normalerweise mache ich diese Funktionen, die sehr explizit über was Sie brauchen und entkoppelt von der Klasse, so dass Sie nicht brauchen Zugang zu den Klasse-Interna.
- Kann jemand machen, mich zu verstehen, was die <anonyme namespace - > ist in diesem Zusammenhang gut? Ich bin neugierig und würde gerne etwas darüber erfahren...
- Schnelle Antwort: in diesem Kontext ist es das gleiche wie die Deklaration der Funktion wie
static
(file-scope) und garantiert gibt es keinen Kampf, während die Verknüpfung mit anderen globalen Funktionen mit dem gleichen Namen. Lange Antwort: Sie sollten sich Fragen, dies als eine separate Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn die Funktion nur in einer source-Datei, macht es durchaus Sinn, es zu definieren gibt. Wenn niemand anderes es, es gehört nicht in den header.
Wie Sie sagen, es reduziert Abhängigkeiten und kann potenziell sparen Sie etwas neu kompiliert.
static
Funktionen in der Quelldatei in solchen Fällen. (Heute, selbst wenn die Funktion benötigt wird, in mehr als einer Quelle, ich werde es erklären, in einem eigenen namespace, in einer private header, die ist nur bei der Umsetzung Dateien, und nicht geliefert, mit der Bibliothek.)Begann ich diese mehrere Jahre vor und nie gefunden keine echte draw-Rücken. Alles, was das Objekt nutzt, aber nicht selbst verändern den Zustand des Objekts und müssen nicht verwendet werden, sonst nirgends, ich möchte in einem anonymen namespace in der Implementierungsdatei.
Ich sehe keine Nachteile mit einem anonymen Namensraum. Wenn Sie kann code der Funktion ist sinnvoll, ohne Zugriff auf die Klassenmitglieder, dann sollten Sie, denn es entkoppelt es von der Klasse selbst (wie die standard-algorithmen arbeiten auf iterator-Paare).
Persönlich, die nur statische Funktionen, die ich verwenden, sind die Fabrik-Funktionen, wie diese
Etwas, das nicht braucht, der private Zugang erfolgt eine Kostenlose Funktion. Alles, was nicht Teil der öffentlichen Schnittstelle ist, wenn möglich, nicht an einem öffentlichen Ort (konform mit Ihren neuen Ansatz).
Scott Meyers Artikel "Wie Nicht-Member-Funktionen Verbessern Kapselung" grob beschrieben, den gleichen Ansatz:
Private static non-const Variablen sind nutzlos für jeden code nicht in der .cpp, so dass ich immer eine anonyme namespace wie die.
Static const-Variablen können Dokument Zwänge und Erwartungen, sind nützlich, um client-code, also gehen Sie in die Kopfzeile.
Statische Funktionen erfordern möglicherweise Zugriff auf private Daten der Mitglieder, also gehen Sie in der Kopfzeile , wenn Sie.
Wenn Sie eine Einheit bauen (d.h. #inklusive aller .cpp-Dateien dem Projekt in einer compilation unit, um zu beschleunigen compile-Zeiten), Sie werden riskieren Kollisionen mit Namen, die mit anderen Funktionen in anonymen namespaces.
Das ist der einzige Nachteil, die ich gefunden habe.
Der ganze Grund für die statische Funktion, im Gegensatz zu globalen Funktion, die Zugriff auf die privaten Elemente der Klasse. Wenn dies nicht der Fall, verwenden Sie eine Kostenlose Funktion. Diese Analyse ist nicht die vollständige Antwort, bis wir alle 3 alternative Möglichkeiten, es zu tun:
free-Funktion:
statische Funktion:
Freund-Funktionen:
Das eigentliche problem, wie der c++ tut, ist, dass der Aufruf der Funktion sieht anders aus: