it-swarm.com.de

Vorteile von Klassen mit nur statischen Methoden in C++

Auch wenn es keine statischen Klassen in C++ gibt, die aus einem Java-Hintergrund stammen, verwende ich zum Erstellen einer Hilfsklasse wie Util, die nur statische Methoden enthält. Wird dies als schlechter Stil oder übliche Praxis betrachtet? Eine Alternative, die ich sehe, ist die Verwendung von C-Funktionen (überhaupt keinen Klassenkontext). Welche anderen Alternativen gibt es? Welche Vor- und Nachteile gibt es und unter welchen Umständen würde ich diese verwenden?.

Definieren einer Reihe statischer Methoden in C++ schlägt als Alternative eine statische Funktion mit Namensraum vor, obwohl ich nicht sehe, welche Auswirkungen das static-Schlüsselwort ohne Klassenkontext hat. 

25
dcn

Wenn Sie eine Sammlung von Utility-Funktionen erstellen möchten, ohne den globalen Namespace zu beeinträchtigen, sollten Sie nur reguläre Funktionen in ihrem eigenen Namespace erstellen:

namespace utility {
    int helper1();
    void helper2();
};

Sie möchten wahrscheinlich auch keine statischen Funktionen erstellen. Im Kontext einer Nicht-Member-Funktion (im Gegensatz zu einer Member-Funktion) schränkt das statische Schlüsselwort in C und C++ lediglich den Umfang der Funktion ein auf die aktuelle Quelldatei (dh sie macht die Funktion für die aktuelle Datei privat). Es wird normalerweise nur zum Implementieren interner Hilfsfunktionen verwendet, die von in C geschriebenem Bibliothekscode verwendet werden, so dass die resultierenden Hilfsfunktionen keine Symbole enthalten, die für andere Programme verfügbar sind. Dies ist wichtig, um Kollisionen zwischen Namen zu vermeiden, da C keine Namespaces hat.

29
James O'Doherty

In C++ werden Klassen mit only static - Methoden meist bei der Metaprogrammierung von Vorlagen verwendet.

Zum Beispiel möchte ich berechnen Fibonacci-Zahlen bei Compile-Time selbst, und zur Laufzeit möchte ich, dass sie nur gedruckt werden, dann kann ich dieses Programm schreiben:

#include <iostream>

template<int N>
struct Fibonacci 
{
   static const int value = Fibonacci<N-1>::value + Fibonacci<N-2>::value;
   static void print()
   {
       Fibonacci<N-1>::print();
       std::cout << value << std::endl;
   }
};


template<>
struct Fibonacci<0>
{
   static const int value = 0;
   static void print()
   {
       std::cout << value << std::endl;
   }
};

template<>
struct Fibonacci<1>
{
   static const int value = 1;
   static void print()
   {
       Fibonacci<0>::print();
       std::cout << value << std::endl; 
   }
};

int main() {
        Fibonacci<20>::print(); //print first 20 finonacci numbers
        return 0;
}

Online-Demo: http://www.ideone.com/oH79u

13
Nawaz

C++ ist eine Multi-Paradigmasprache . Wenn Sie also einige nützliche Funktionen benötigen, die vielleicht nicht wirklich in eine Klasse passen, dann würde ich sie nur als freie Funktionen erstellen. Ich sehe keinen Grund, sie in eine Klasse zu stecken, nur um OOPs willen. 

Es gibt keinen Vorteil, den ich sehen kann, wenn alle Funktionen static gemacht und in eine Klasse eingefügt werden, da sie nur als freie Funktionen verfügbar sind. Ich persönlich denke, dass kostenlose Funktionen dann einfacher mit der Option zu arbeiten sind.

6
Tony The Lion

Wie viele andere bereits erwähnt haben, sind freie Funktionen in einem Namespace ein Ansatz, der in c++ häufig für diese Art von Dingen verwendet wird.

Ein Fall, den ich für Klassen mit allen statischen Funktionen verwenden würde, ist der, wenn Sie einer Reihe von Funktionen Informationen aussetzen möchten, die von Vorlagenparametern abgeleitet sind, d. H.

template <typename Ty>
    class utils
{
public :
// if you need to setup a bunch of secondary types, based on "Ty" that will be used 
// by your utility functions
    struct item_type
    { 
        Ty data;
        // etc
    }; 

// a set of utilities
    static void foo(Ty &data1, item_type &item)
    { 
        // etc
    }
};

Sie können dies verwenden, um den Effekt eines Template-Namespaces zu erzielen:

int main ()
{
    double data;
    utils<double>::item_type item ;
    utils<double>::foo(data, item);

    return 0;
}

Wenn Sie keine Vorlagen verwenden, bleiben Sie bei den Namespaces.

Hoffe das hilft.

2
Darren Engwirda

Dies kann für Ihre Interessen relevant sein. Es ist ein Artikel, der die unterschiedlichen Ansätze für Klassen und Funktionen in Java im Vergleich zu anderen Sprachen untersucht. 

http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html

1
Matt

Es gibt kein echtes Problem bei der Deklaration statischer Methoden innerhalb einer Klasse. Zwar eignen sich Namespaces aus den in dem Beitrag genannten Gründen eher für diesen Zweck.

Die Verwendung von C-Funktionen kann Namenskollisionen erzeugen, es sei denn, Sie entscheiden sich für eine Namenskonvention, indem Sie Ihren Funktionen Vorgänge voranstellen, beispielsweise btFunctionA, btFunctionB usw. Sie sollten Ihre Symbole in Namespaces lassen, um dies zu vermeiden C++ und nicht C.

Statische Funktionen innerhalb eines Namespaces unterscheiden sich nicht von nicht statischen. Ich glaube, das statische Schlüsselwort wird in diesem Zusammenhang einfach ignoriert.

1
EddieBytes

In C++ machen Sie sie einfach zu freien Funktionen. Es gibt keinen Grund oder keinen Grund, sie überhaupt in eine Klasse einzuordnen. Es sei denn, Sie zittern mit Vorlagen.

1
Puppy

Es gibt eine andere Situation, in der eine statische Klasse einem Namespace vorgezogen werden könnte: Wenn Sie die Daten als privat kennzeichnen möchten, damit sie nicht direkt von außerhalb der Klasse/des Namespaces geändert werden können, sondern aus Leistungsgründen, die Sie haben möchten public inline Funktionen, die darauf ausgeführt werden. Ich glaube nicht, dass es eine andere Möglichkeit gibt, dies mit einem Namespace zu tun, als eine Klasse innerhalb des Namespace zu deklarieren.

0
dc42