Domanda

Ho una funzione che fa il seguente:

  • Quando la funzione viene chiamato e ha approvato una vero valore bool, imposta un valore statico bool true
  • Quando la funzione è chiamata e passata una stringa, se il valore bool statico è impostata su true, si farà qualcosa con quella stringa

Questa è la mia preoccupazione - sarà una variabile statica rimarrà lo stesso tra due funzioni in overload? In caso contrario, posso semplicemente creare una funzione separata progettato per tenere traccia del valore bool, ma cerco di mantenere le cose semplici.

È stato utile?

Soluzione

No, crea due variabili statiche separate - una per ogni funzione. Il nome della funzione qualsiasi C ++ è fatta op del suo nome apparente e suoi tipi di parametri, e il nome della statica è (almeno concettualmente) appiccicato a quello. Invece di aggiungere ancora un'altra funzione, si potrebbe considerare la variabile statica rispetto alla classe che contiene le funzioni, anche se questo non ti dà esattamente lo stesso comportamento, o metterlo in uno spazio dei nomi anonima:

namespace {
   int myvar = 0;
}

int f( bool b ) {
   return myvar;
}

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

Per rendere le funzioni membri di una 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;   
}

Altri suggerimenti

Due sovraccarico funzioni sono due funzioni diverse. Anche se ogni funzione contiene una static bool con lo stesso identificatore, appartengono in ambiti diversi e l'identificatore si riferisce a una variabile distinta in ogni funzione.

Se avete bisogno di stato di quota tra due funzioni si sono probabilmente meglio fare una classe per incapsulare questo stato e rendendo le funzioni di due funzioni membro di questa classe.

La risposta è no. Non v'è alcun motivo che dovrebbe essere, dal momento che dopo tutto stiamo parlando di 2 funzioni.

Dal momento che è già stato dimostrato, mi piacerebbe affrontare il cuore della questione:. static

static introduce stato globale, e lo stato globale è il male. Essa conduce a bug sottili, le difficoltà per testare correttamente (dal momento che un test colpisce quelle eseguito dopo essere) e non pensate nemmeno di andare multithreaded lì ...

Perciò sarebbe davvero ti incoraggia a evitare il static del tutto. Si potrebbe quindi avere 2 soluzioni:

  • Fare una classe con i due overload come metodi, e lo stato del serbatoio (non statica, per favore)
  • Far passare il bool come parametro per i metodi, fuori parametro per il sovraccarico di bool e parametri per la stringa di sovraccarico

Pick up a seconda di quale è più facile da realizzare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top