Raison pour appeller une fonction statique a partir d'une instance

Le problème exposé dans ce sujet a été résolu.

Donc .. je viens de réaliser au travail qu’il est possible d’appeller une fonction statique a partir d’une instance ..

Je ne trouve cependant pas de bonne raison de le faire et mes collegues non plus ..

Question curiosité : Est-ce qu’il existe un cas / une raison pour laquelle on voudrais appeller une fonction statique a partir d’une instance ? :euh: Est-ce juste un comportement etrange que le c++ autorise mais n’est pas utile et doit etre évité

+0 -0

Est-ce juste un comportement etrange que le c++ autorise mais n’est pas utile et doit etre évité

SoniaChartrand

Pour qu’on soit d’accord sur quoi on parle, tu parles de ca ?

class A {
public:
    static void foo();
};

A::foo(); // ok

A a;
a.foo(); // ok ???

Une fonction statique aura le même comportement, qu’elle soit appelé a partir d’une instance ou non. Donc les appels de foo dans le code précédant feront la même chose. Donc c’est une syntaxe inutile et en général, on fait pas ça, pour éviter la confusion (mais je suppose que ça peut se faire, par exemple dans un template).

+0 -0

Qu’est-ce qu’une fonction statique ? Rien de plus qu’une fonction. C’est similaire à une fonction dans un namespace. Donc ça revient à décider où mettre la fonction (libre ? dans un namespace ? statique dans une classe ?).

minirop

Le lien suivant pourrait aider:

Difference between static and constant function in C++ - GeeksforGeeks.

PierrotLeFou

Merci de vos réponses. Je comprend bien ce qu’est une fonction statique. Je n’avais juste jamais croiser un cas ou je pouvais appeller une fonction statique a partir d’une instance. Ca m’est arrivé "par accident" et j’ai été surpris que mon code compile meme .. et fonctionne.

Est-ce juste un comportement etrange que le c++ autorise mais n’est pas utile et doit etre évité

SoniaChartrand

Pour qu’on soit d’accord sur quoi on parle, tu parles de ca ?

class A {
public:
    static void foo();
};

A::foo(); // ok

A a;
a.foo(); // ok ???

Une fonction statique aura le même comportement, qu’elle soit appelé a partir d’une instance ou non. Donc les appels de foo dans le code précédant feront la même chose. Donc c’est une syntaxe inutile et en général, on fait pas ça, pour éviter la confusion (mais je suppose que ça peut se faire, par exemple dans un template).

gbdivers

C’est effectivement de ce cas que je parle oui ! Ta réponse est la même que mes collegues : "Ca existe mais c’est inutile et confondant". Il n’existe donc pas de cas particulier ou on voudrais volontairement le faire et ou ca devient une feature utile du fonctionnement de c++ ? Ca reste possible , mais on evite tout simplement.

Je ne suis pas expert en programmation, donc n’hésitez pas à me reprendre si j’ai faux. Mais de mon point de vue, ça a un intérêt de rangement lorsque qu’une fonction est intrinsèquement liée à une classe.

Exemple :

class Polyline {
public:
    Polyline();
    Polyline(std::vector<Point> const points);


    /* Ici: créer un constructeur acceptant un chemin d’accès serait possible, mais moins lisible, là où une fonction statique explique très clairement qu’elle effectue une conversion.

    Une méthode classique nécessiterait de créer l’objet en deux lignes : une pour créer l’objet, l’autre pour le remplir là où la méthode statique permet de retourner directement l’objet voulu.

    Une fonction serait moins explicite : qu’est-ce qu’elle retourne ? Si plusieurs objets peuvent être construit grâce a un fichier texte ? */
    static Polyline from_text_file(string const path);
};

En tout cas, il me semble que c’est l’usage qu’en fait QString.

+0 -0

L’intérêt me parait également assez limité. Si c’est pour changer la visibilité, je vais autant partir (hors template) vers une fonction définie et limitée au .cpp associé au .h(pp). Si c’est pour le scoping… pourquoi en faire une statique alors?

Ceci dit j’ai déjà vu ce genre de fonction, mais elle avait alors 2 paramètres, et l’association à la classe c’était … un portage direct de désign Java qui ne permet pas l’existence de fonctions libres. Genre une fonction distance, une fonction angle, etc. EDIT: avec factorisation entre une version membre et une version statique

PS: l’exemple "de" Qt, c’est une factory, et pour le coup, il y a assez peu de change qu’elle soit appelée depuis une instance.

Alors, je ne suis pas certain d’avoir compris l’intégralité de ton message, mais :

et pour le coup, il y a assez peu de change qu’elle soit appelée depuis une instance.

n’est-il pas la réponse à

Si c’est pour le scoping… pourquoi en faire une statique alors?

?

Hum… Je vois si je peux éclaircir un truc écrit il y a une "éternité".

2 grands intérêts aux fonctions statiques:

  • gérer les accès privilégiés (pas possible avec l’espace de noms et sans amitié)
  • rajouter une portée au nom
  • (plus des trucs avec de la méta prog template; HS vu le "appel de fonction statique depuis instance")

Quant à mon "PS", c’était pour faire remarquer que cette exemple de fonction statique ne répond pas à la question initiale: "appel de fonction statique depuis une instance" Et ces intérêts commencent arrivent essentiellement ensemble et quand on veut garder un nom de classe déjà existant.

Et en relisant le thread je me rend compte que je n’avais pas du tout compris la question initiale. Je croyais qu’il s’agissait d’appeler une fonction membre statique depuis un fonction membre non statique… Ma remarque relativement à l’exemple de Qt reste vrai: cela ne correspond pas au contexte posé par SoniaChartrand :p -> Appeler une factory à partir d’une instance… c’est impossible dans bien des situations.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte