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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top