Frage

Ich verwende gerne statische Funktionen in C++, um sie zu kategorisieren, so wie es C# tut.

Console::WriteLine("hello")

Ist das gut oder schlecht?Wenn die Funktionen häufig verwendet werden, ist das meiner Meinung nach egal, aber wenn nicht, belasten sie den Speicher?

Wie wäre es mit static const?

War es hilfreich?

Lösung

aber ist es gut oder schlecht?

Das erste Adjektiv, das mir in den Sinn kommt, ist „unnötig“.C++ verfügt über freie Funktionen und Namespaces. Warum sollten Sie diese also zu statischen Funktionen in einer Klasse machen?

Die Verwendung statischer Methoden in nicht instanziierbaren Klassen in C# und Java ist eine Problemumgehung weil diese Sprachen keine freien Funktionen haben (d. h. Funktionen, die sich direkt im Namespace befinden und nicht als Teil einer Klasse).C++ hat diesen Fehler nicht.Verwenden Sie einfach einen Namespace.

Andere Tipps

Ich bin voll und ganz für die Verwendung von statischer Aufladung Funktionen.Diese machen einfach Sinn, besonders wenn sie in Modulen organisiert sind (static class in C#).

Jedoch, der Moment Diese Funktionen benötigen externe Daten (nicht zur Kompilierungszeit konstante Daten). Anschließend sollte diese Funktion zu einer Instanzmethode gemacht und zusammen mit ihren Daten in einer Klasse gekapselt werden.

Kurzgesagt:Statische Funktionen ok, statische Daten schlecht.

Wer sagt, dass statische Funktionen durch Namespaces ersetzt werden können, liegt falsch. Hier ein einfaches Beispiel:

class X
{
   public:
   static void f1 ()
   {
      ...
      f2 ();
   }

   private:
     static void f2 () {}
};

Wie Sie sehen können, öffentliche statische Funktion f1 ruft eine andere statische, aber private Funktion auf f2.

Dabei handelt es sich nicht nur um eine Sammlung von Funktionen, sondern um eine intelligente Sammlung mit eigenen gekapselten Methoden.Namespaces würden uns diese Funktionalität nicht bieten.

Viele Leute verwenden das „Singleton“-Muster, nur weil es gängige Praxis ist, aber in vielen Fällen benötigen Sie eine Klasse mit mehreren statischen Methoden und nur einem statischen Datenelement.In diesem Fall ist überhaupt kein Singleton erforderlich.Ruft auch die Methode auf instance() ist langsamer als nur der direkte Zugriff auf die statischen Funktionen/Mitglieder.

Verwenden Sie Namespaces, um eine Sammlung von Funktionen zu erstellen:

namespace Console {
    void WriteLine(...) // ...
}

Was den Speicher betrifft, nutzen Funktionen die gleiche Menge außerhalb einer Funktion, als statische Memberfunktion oder in einem Namespace.Das ist:Keine Erinnerung außer dem Code selbst.

Ein spezifischer Grund dafür, dass statische Daten schlecht sind, besteht darin, dass C++ keine Garantien für die Initialisierungsreihenfolge statischer Objekte in verschiedenen Übersetzungseinheiten gibt.In der Praxis kann dies zu Problemen führen, wenn ein Objekt von einem anderen in einer anderen Übersetzungseinheit abhängt.Scott Meyers diskutiert dies in Punkt 26 seines Buches More Effective C++.

Ich stimme hier Frank zu, es gibt kein Problem mit statischen (globalen) Funktionen (natürlich vorausgesetzt, sie sind organisiert).Die Probleme schleichen sich erst richtig ein, wenn die Leute denken: „Oh, ich werde den Umfang dieser Daten etwas erweitern.“Rutschiger Hang :)

Um es wirklich ins rechte Licht zu rücken.. Funktionale Programmierung ;)

Das Problem bei statischen Funktionen besteht darin, dass sie zu einem Design führen können, das die Kapselung unterbricht.Wenn Sie beispielsweise feststellen, dass Sie etwas schreiben wie:

public class TotalManager
{
    public double getTotal(Hamburger burger)
    {
        return burger.getPrice() + burget.getTax();
    }
}

...dann müssen Sie möglicherweise Ihr Design überdenken.Bei statischen Funktionen müssen Sie häufig Setter und Getter verwenden, was die API einer Klasse überfüllt und die Dinge im Allgemeinen komplizierter macht.In meinem Beispiel wäre es möglicherweise besser, die Getter von Hamburger zu entfernen und einfach die Klasse getTotal() in Hamburger selbst zu verschieben.

Ich neige dazu, Klassen zu erstellen, die aus statischen Funktionen bestehen, aber einige sagen, dass der „richtige Weg“, dies zu tun, normalerweise darin besteht, stattdessen Namespaces zu verwenden.(Ich habe meine Gewohnheiten entwickelt, bevor C++ Namespaces hatte.)

Übrigens: Wenn Sie eine Klasse haben, die nur aus statischen Daten und Funktionen besteht, sollten Sie den Konstruktor als privat deklarieren, damit niemand versucht, ihn zu instanziieren.(Dies ist einer der Gründe, warum einige dafür plädieren, Namespaces anstelle von Klassen zu verwenden.)

Verwenden Sie zur Organisation Namensräume wie bereits erwähnt.

Für globale Daten verwende ich gerne die Singleton Muster, weil es beim Problem der unbekannten Initialisierungsreihenfolge statischer Objekte hilft.Mit anderen Worten: Wenn Sie das Objekt als Singleton verwenden, wird es garantiert initialisiert, wenn es verwendet wird.

Stellen Sie außerdem sicher, dass Ihre statischen Funktionen zustandslos sind, damit sie threadsicher sind.

Normalerweise verwende ich Statik nur in Verbindung mit dem Freundesystem.

Ich habe zum Beispiel eine Klasse, die viele (inline) interne Hilfsfunktionen verwendet, um Dinge zu berechnen, einschließlich Operationen an privaten Daten.

Dadurch erhöht sich natürlich die Anzahl der Funktionen der Klassenschnittstelle.Um das zu beseitigen, deklariere ich eine Hilfsklasse in der .cpp-Datei der ursprünglichen Klasse (und damit für die Außenwelt unsichtbar), mache sie zu einem Freund der ursprünglichen Klasse und verschiebe dann die alten Hilfsfunktionen in ein statisches (Inline-)Mitglied Funktionen der Hilfsklasse, wobei zusätzlich zu den alten Parametern die alte Klasse per Referenz übergeben wird.

Dadurch bleibt die Benutzeroberfläche schlank und es ist keine große Liste kostenloser Freundesfunktionen erforderlich.Inlining funktioniert auch gut, daher bin ich nicht komplett gegen Statik.(Ich vermeide es so weit ich kann, aber ich verwende es gerne auf diese Weise.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top