Variáveis estáticas em funções sobrecarregadas
-
27-09-2019 - |
Pergunta
Eu tenho uma função que faz o seguinte:
- Quando a função é chamada e passa um valor bool verdadeiro, ela define um valor bool estático como verdadeiro
- Quando a função é chamada e passada uma string, se o valor bool estático for definido como true, ela fará algo com essa string
Aqui está a minha preocupação: uma variável estática permanecerá a mesma entre duas funções sobrecarregadas?Caso contrário, posso simplesmente criar uma função separada projetada para controlar o valor bool, mas tento manter as coisas simples.
Solução
Não, ele cria duas variáveis estáticas separadas - uma para cada função.O nome de qualquer função C++ é composto por seu nome aparente e seus tipos de parâmetros, e o nome da estática é (pelo menos conceitualmente) acrescentado a isso.Em vez de adicionar outra função, você poderia considerar tornar a variável estática em relação à classe que contém as funções, embora isso não forneça exatamente o mesmo comportamento, ou colocá-la em um namespace anônimo:
namespace {
int myvar = 0;
}
int f( bool b ) {
return myvar;
}
int f( const string & s ) {
return myvar;
}
Para tornar as funções membros de uma 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;
}
Outras dicas
Duas funções sobrecarregadas são duas funções diferentes. Mesmo que cada função contenha um static bool
Com o mesmo identificador, eles pertencem a escopos diferentes e o identificador refere -se a uma variável distinta em cada função.
Se você precisar compartilhar o estado entre duas funções, provavelmente é melhor fazer uma aula para encapsular esse estado e fazer com que as duas funções funcionem as funções desta classe.
A resposta é não. Não há razão para que seja, pois, afinal, estamos falando de duas funções.
Como já foi demonstrado, gostaria de abordar o núcleo do assunto: static
.
static
Introduz o estado global e o estado global é mau. Isso leva a bugs sutis, dificuldades para testar corretamente (uma vez que um teste afeta os executados depois dele) e nem sequer pensa em ir multithread lá ...
Portanto, eu realmente encorajo você a evitar o static
inteiramente. Você teria 2 soluções:
- Faça uma aula com as duas sobrecargas como métodos e armazenar o estado (não estático, por favor)
- Passe o bool como parâmetro para os métodos, o Outâmetro para a sobrecarga BOOL e o parâmetro para a sobrecarga da string
Pegue o que for mais fácil de alcançar.