In C ++, dovrei mai dichiarare una variabile locale nell'intestazione corrispondente?

2

Quindi, ad esempio, creo una classe con due funzioni:

foo.h

class foo
{
public:
    foo();
    void bar();
    void ey();
    bool m_memberBool;
    bool localBool; // ??? Should I put this here?
};

foo.cpp

#include "foo.h"

foo::foo() {
    bool m_memberBool = true;
}
void foo::bar() {
    bool localBool = true;
    if (localBool && m_memberBool) {
        ey();       
    }
}
void foo::ey() {
    m_memberBool = false;
}

Devo mai includere quella variabile locale o qualsiasi variabile locale in un'intestazione? In caso contrario, dovrei mai documentarlo nell'intestazione?

    
posta user2690449 25.04.2015 - 14:10
fonte

3 risposte

15

Tecnicamente, la risposta corretta alla tua domanda è che è una contraddizione in termini. Non appena si alza una variabile nella definizione della classe, non è più una variabile locale, è una variabile membro.

Ma presumo che tu stia chiedendo se c'è sempre un buon motivo per innalzare una variabile locale nello stato della variabile membro. Questa domanda si riduce allo scopo della tua classe e di quella variabile.

La regola generale è: tutte le variabili devono essere dichiarate nel più stretto ambito possibile . In altre parole, non dichiararlo dove tutto il foo può usarlo se solo foo :: bar ha bisogno di usarlo. In genere è una cattiva idea che il codice abbia accesso a variabili di cui non ha realmente bisogno, perché aumenta il rischio che alla fine dipenda o facciano affidamento su quelle variabili che hanno certe valori in determinati momenti, che li accoppia a tutti gli altri codici usando quelle variabili, rendendo più difficile cambiare una parte senza rompere gli altri.

Gli altri metodi di foo hanno effettivamente bisogno di accedere a questo bool? In caso contrario, tienilo locale. Puoi sempre rilanciarlo più tardi se si presenta una buona ragione.

    
risposta data 25.04.2015 - 14:30
fonte
1

Should I ever include that local variable, or any local variable ever in a header?

L'unico caso a cui riesco a pensare è se si scrive una funzione inline o di un modello: per quelli, il corpo della funzione / metodo dovrebbe essere nell'intestazione. Quindi, ovviamente, anche le variabili locali sono nell'intestazione.

If not, should I ever document it in the header?

Potrebbero esserci casi rari in cui un chiamante deve essere a conoscenza di una variabile locale di una funzione. Per esempio. se lo spazio di stack è scarso e la funzione utilizza una variabile di array locale di 100k. O se si tratta di una funzione template che non crea ovviamente un'istanza del suo parametro template - quell'informazione potrebbe essere importante per il chiamante.

Ma quelli sono casi limite estremi e interpretati. Nel caso generale, l'intestazione dovrebbe documentare solo il "contratto" esterno offerto dalle funzioni, comportamento a cui il chiamante può fare affidamento anche nelle future versioni del codice.

I guess another way to ask this, is if a variable that I am using is only used in one function; should I always just make it a local variable, or are there cases where that variable should be made a member?

Come ha detto @Bandandin: lo faresti membro, se hai la necessità di preservare lo stato tra chiamate diverse.

Tuttavia, potrebbe essere un progetto più pulito dividere quel membro e quella funzione in una classe separata e avere invece un membro di quella classe:

class BarState
{
private:
    bool localFlag;
public:
    void Bar();
    // or even:
    void operator()();
};

class Foo
{
    BarState bar;
};

In questo modo è chiaro che:

  • la "funzione" Bar mantiene lo stato tra le chiamate
  • il membro localFlag è inteso come privato a Bar
risposta data 25.04.2015 - 18:41
fonte
0

Member variables sono i tipi di valore associati alla classe e quindi faranno parte dell'oggetto di quella classe.

Local variables sono i valori value che sono locali all'ambito. L'ambito potrebbe essere functions , if conditions o swith case , in genere tutto ciò in cui si utilizza {} .

Ora, se devi decidere dove mettere e quindi usare queste regole pratiche:

  1. Member variable è un attributo di classe. il che significa che potrebbe essere usato dai metodi e / o dai manipolatori degli oggetti di classe.
  2. Local variable è richiesto localmente per le manipolazioni o come detentore di valore temporaneo, il che significa che è utile solo per lo scope corrente.

Spero che sia stato d'aiuto. Si prega di commentare eventuali domande.

    
risposta data 27.04.2015 - 11:29
fonte

Leggi altre domande sui tag