Question

J'ai une fonction qui effectue les opérations suivantes:

  • Lorsque la fonction est appelée et a adopté une vraie valeur bool, il définit une valeur bool statique true
  • Lorsque la fonction est appelée et a adopté une chaîne, si la valeur bool statique est définie sur true, il fera quelque chose avec cette chaîne

Voici ma préoccupation - sera une variable statique reste le même entre deux fonctions surchargées? Sinon, je peux simplement créer une fonction distincte conçue pour garder une trace de la valeur bool, mais j'essayer de garder les choses simples de.

Était-ce utile?

La solution

Non, il crée deux variables statiques distinctes - une pour chaque fonction. Le nom d'une fonction C est constitué de op de son nom apparent et ses types de paramètres, et le nom de la statique (au moins conceptuellement) plaquées sur cela. Plutôt que d'ajouter une autre fonction, vous pourriez envisager de faire la statique variable par rapport à la classe contenant les fonctions, bien que cela ne vous donne pas exactement le même comportement, ou le placer dans un espace de noms anonyme:

namespace {
   int myvar = 0;
}

int f( bool b ) {
   return myvar;
}

int f( const string &  s  ) {
   return myvar;
}

Pour les fonctions membres d'une classe:

// a.h
class A {
   public:
    static int f( bool b ) {
       return myvar;
    }

    static int f( const string &  s  ) {
       return myvar;
    }
  private:
     static int myvar;
};

// a.cpp
int A::myvar = 0;   

// main.cpp

#include <iostream>
#include <a.h>
int main() {
    std::cout << A::f(false) << A::f( string("foobar") ) << std::endl;   
}

Autres conseils

Deux surcharge fonctions sont deux fonctions différentes. Même si chaque fonction contient un static bool avec le même identifiant, ils appartiennent à différents champs d'application et l'identifiant fait référence à une variable distincte dans chaque fonction.

Si vous devez partager l'état entre deux fonctions, vous êtes probablement mieux de faire une classe pour encapsuler cet état et faire les deux fonctions fonctions membres de cette classe.

La réponse est non. Il n'y a aucune raison pour laquelle il devrait être, car après tout ce que nous parlons de 2 fonctions.

Comme il a déjà été démontré, je voudrais aborder le cœur même de la matière. static

static introduit état global, et de l'état global est mauvais. Elle conduit à des bugs subtils, des difficultés à tester correctement (car un test affecte ceux exécutés après) et ne pense même pas à aller là-bas multithread ...

Par conséquent, je vous encourage vraiment à éviter complètement le static. Vous auriez alors 2 solutions:

  • Faites une classe avec les deux méthodes que les surcharges et l'état du magasin (pas statique, s'il vous plaît)
  • passer le bool en tant que paramètre pour les méthodes, out-paramètre pour la surcharge de bool et en paramètre pour la surcharge chaîne

Ramassez si elle est plus facile à réaliser.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top