Variables estáticas en funciones sobrecargadas
-
27-09-2019 - |
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.
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.