web-dev-qa-db-fra.com

Avantages des classes avec uniquement des méthodes statiques en C++

Bien qu'il n'y ait pas de classes statiques en C++ , provenant d'un arrière-plan Java, j'utilise pour créer une classe d'assistance telle que Util contenant uniquement des méthodes statiques. Est-ce que cela est considéré mauvais styleou pratique habituelle? Une solution que je vois est d'utiliser des fonctions C (pas de contexte de classe du tout). Quelles sont les autres alternatives? Quels sont les avantages et les inconvénients et dans quelles circonstances en utiliserais-je? de ceux-ci.

Définir un ensemble de méthodes statiques dans c ++ suggère une option pour les fonctions statiques namespacing, bien que je ne voie pas les effets du mot clé static sans contexte de classe. 

25
dcn

Si vous souhaitez créer une collection de fonctions utilitaires sans masquer l'espace de noms global, vous devez simplement créer des fonctions standard dans leur propre espace de noms:

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

Vous ne voulez probablement pas non plus en faire des fonctions statiques. Dans le contexte d'une fonction non membre (par opposition à une fonction membre), le mot clé static en C et C++ limite simplement la portée de la fonction. vers le fichier source actuel (c’est-à-dire qu’elle rend la fonction privée du fichier actuel). Il est généralement utilisé uniquement pour implémenter des fonctions d'assistance internes utilisées par le code de bibliothèque écrit en C, de sorte que les fonctions d'assistance résultantes ne comportent pas de symboles exposés à d'autres programmes. Ceci est important pour éviter les conflits entre les noms, car C n'a pas d'espaces de noms.

29
James O'Doherty

En C++, les classes avec les méthodes only static sont principalement utilisées dans la métaprogrammation des modèles.

Par exemple, je veux calculer nombres de fibonacci à compile-time lui-même, et à l'exécution, je veux qu'ils n'impriment que, alors je peux écrire ce programme:

#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;
}

Démo en ligne: http://www.ideone.com/oH79u

13
Nawaz

C++ est un langage multi-paradigme}, donc si vous avez besoin de fonctions utilitaires qui ne rentrent peut-être pas dans une classe, je les rendrais simplement libres. Je ne vois aucune raison de les mettre dans une classe, juste pour le plaisir de la programmation. 

Je ne vois aucun avantage à faire en sorte que toutes les fonctions static et en les plaçant dans une classe, au lieu de les avoir comme des fonctions libres. Personnellement, je pense que les fonctions libres sont alors une option plus facile à utiliser.

6
Tony The Lion

Comme beaucoup d'autres l'ont souligné, les fonctions libres à l'intérieur d'un espace de noms sont une approche souvent adoptée pour ce genre de chose dans c++.

Un cas que je ferais pour des classes avec toutes les fonctions statiques est lorsque vous souhaitez exposer un ensemble de fonctions à des informations dérivées des paramètres de modèle, c.-à-d.

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
    }
};

Vous pouvez l'utiliser pour obtenir l'effet d'un espace de nom modèle:

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

    return 0;
}

Si vous n'utilisez pas de modèles, utilisez uniquement des espaces de noms.

J'espère que cela t'aides.

2
Darren Engwirda

Cela peut être pertinent pour vos intérêts. C'est un article qui examine les différentes approches des classes et des fonctions en Java par rapport à d'autres langages. 

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

1
Matt

La déclaration de méthodes statiques au sein d'une classe ne pose aucun problème réel. Bien que les espaces de noms conviennent mieux à cette fin pour les raisons mentionnées dans le message auquel vous faites référence.

L'utilisation de fonctions C peut générer des conflits de noms, à moins que vous ne décidiez d'une convention de nommage, préfixant vos fonctions de trucs, par exemple, btFunctionA, btFunctionB, etc. Vous voudrez conserver vos symboles dans les espaces de noms pour éviter cela C++ et pas C après tout.

Les fonctions statiques dans un espace de noms ne sont pas différentes des fonctions non statiques. Je crois que le mot clé static est simplement ignoré dans ce contexte.

1
EddieBytes

En C++, rendez-les simplement libres. Il n'y a pas besoin ni raison de les placer dans une classe du tout. À moins que vous ne fassiez des ratés avec des modèles.

1
Puppy