Domanda

EDIT: dichiarandoli privato è stato un errore di battitura, ho riparato:

In relazione a un'altra domanda, se ho dichiarato una variabile statica in una classe, poi derivato una classe che, c'è un modo per dichiarare la variabile statica come individuale per ogni classe. Vale a dire:

class A:
{
public:
static int x;
};
class B:A
{
public:
const static int x;
};

fa che definiscono due diverse variabili x statico, uno per la A e uno per la B, o avrò un errore per ridefinire x, e se faccio un errore, come si fa un creo due variabili statiche separati?

È stato utile?

Soluzione

Quando si utilizza variabili statiche, potrebbe essere una buona idea per fare riferimento a loro in modo esplicito:

public class B:A
{
  public const static int x;
  public int foo()
  {
    return B::x;
  }
}

In questo modo, anche se la classe "al di sopra" tuo nella gerarchia decide di creare un membro dal nome simile, non si romperà il vostro codice. Allo stesso modo, io di solito cerco di noi la parola chiave quando si accede this normali campi membro.

Aggiornamento sintassi da utilizzare C ++.

Altri suggerimenti

Questo crea due variabili statiche separati.

Si noti che si è implicitamente dichiarato questi privato:

class A:
{
  private:
  static int x;
};
class B:A
{
  private:
  const static int x;
};

Il che significa che le variabili non sono in concorrenza tra loro.

Come già detto, che crea due variabili distinte:

A::x;

// and 

B::x;

In realtà, se si tenta di utilizzare solo 'x' in un metodo di B, sarà usato solo la definizione ambito più vicino finché non si è più precisa:

#include <iostream>

class A
{
protected:
static int x;

public:
    A() { x = 7; }
};

int A::x = 22;

class B:A
{
static const int x = 42;

public:

    int a_x() const { return A::x; }
    int b_x() const { return B::x; }
    int my_x() const { return x; } // here we get the more local variable, that is B::x.
};

int main()
{
    B b;

    std::cout << "A::x = " << b.a_x() << std::endl;
    std::cout << "B::x = " << b.b_x() << std::endl;
    std::cout << "b's x = " << b.my_x() << std::endl;

    std::cin.ignore();
    return 0;
}

Uscite:

A::x = 7
B::x = 42
b's x = 42

Qualcuno ha detto che l'accessibilità potrebbe limitare l'accessibilità: rendendo il privato variabile di base non renderlo accessibile alla classe bambino. Tuttavia, se la variabile devono essere protetti o pubblico, utilizzare un metodo di accesso esplicita o fare affidamento sulla regola di ambito locale, ho appena dimostrato.

Se si desidera una variabile statica che è individuale per ogni classe che utilizza un - è possibile utilizzare una classe modello
. Per esempio

template<class T> struct A
{
   A() { ++s_var; }
   static int s_var;
};

template<class T> int A<T>::s_var;

stuct B :A<B> {
  B() { ++s_var; }  // this is a different s_var than the one used by 'C' below
};

struct C : A<C> {
  C() { ++s_var; } // this is a different s_var than the one used by 'B'
};
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top