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.
InformationsquelleAutor Evan Teran | 2011-07-06
Schreibe einen Kommentar