Pregunta

Tengo una función que hace lo siguiente:

  • Cuando se invoca la función y se pasa un cierto valor bool, se establece un valor static bool true
  • Cuando se invoca la función y se pasa una cadena, si el valor bool estático se establece en true, que va a hacer algo con esa cadena

Esta es mi preocupación - será una variable estática siendo el mismo entre dos funciones sobrecargadas? Si no es así, simplemente puede crear una función separada diseñada para realizar un seguimiento del valor bool, pero trato de mantener las cosas simples.

¿Fue útil?

Solución

No, se crean dos variables estáticas separadas - una para cada función. El nombre de la función de cualquier C ++ se hace op de su nombre aparente y sus tipos de parámetros, y el nombre de la estática es (al menos conceptualmente) tachuelas en a eso. En lugar de añadir otra función, usted podría considerar la posibilidad de la variable estática con respecto a la clase que contiene las funciones, aunque esto no le da exactamente el mismo comportamiento, o colocarlo en un espacio de nombres en el anonimato:

namespace {
   int myvar = 0;
}

int f( bool b ) {
   return myvar;
}

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

Para hacer las funciones de los miembros de una clase:

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

Otros consejos

Dos sobrecargado funciones son dos funciones diferentes. Incluso si cada función contiene una static bool con el mismo identificador, que pertenecen en diferentes ámbitos y el identificador se refiere a una variable distinta en cada función.

Si necesita estado compartir entre dos funciones que son probablemente mejor hacer una clase para encapsular este estado y realizar las funciones dos funciones miembro de esta clase.

La respuesta es no. No hay ninguna razón que debería ser, ya que después de todo estamos hablando de 2 funciones.

Dado que ya se ha demostrado, me gustaría abordar el núcleo de la cuestión:. static

static presenta el estado global, y el estado global es malo. Esto conduce a errores sutiles, las dificultades de prueba correctamente (ya que afecta a una prueba de los ejecutados después de él) y ni siquiera pensar en ir allí multihilo ...

Por lo tanto sería realmente anima a evitar el static por completo. A continuación, tendría 2 soluciones:

  • Hacer una clase con los dos métodos como sobrecargas, y el estado tienda (no estática, por favor)
  • Pase el bool como parámetro a los métodos, fuera de parámetro para la sobrecarga bool y en-parámetro para la cadena de sobrecarga

Recogida el que sea más fácil de lograr.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top