Pregunta

EDIT: declarándolos privada fue un error tipográfico, me fijo:

En relación a otra pregunta, si he declarado una variable estática en una clase, una clase deriva entonces de eso, ¿hay alguna manera de declarar la variable estática como individual por cada clase. Es decir:

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

¿eso definir dos diferentes variables x estática, una por una y otra para B, o voy a obtener un error de redefinir x, y si me pongo un error, ¿cómo hacer una puedo crear dos variables estáticas separadas?

¿Fue útil?

Solución

Cuando se está usando variables estáticas, que podría ser una buena idea para referirse a ellos explícitamente:

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

De esa manera, incluso si la clase "por encima" suyo en la jerarquía decide crear un miembro de nombre similar, no va a romper su código. De la misma manera, por lo general tratan a nosotros la palabra clave this al acceder a campos miembros normales.

Actualización sintaxis para utilizar C ++.

Otros consejos

Esto crea dos variables estáticas separadas.

Tenga en cuenta que usted ha declarado implícitamente estos privado:

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

Lo que significa que las variables no están en competencia unos con otros.

Como ya se ha dicho, que crea dos variables independientes:

A::x;

// and 

B::x;

De hecho, si intenta utilizar simplemente 'x' en un método de B, sólo se utilizará la definición de alcance más cerca hasta que esté más 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;
}

Salidas:

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

Alguien mencionó que la accesibilidad puede limitar la accesibilidad: hacer lo privado variable de base no hará que sea accesible a la clase de niños. Sin embargo, si la variable tienen que ser protegidos o públicos, utilizar un método de acceso explícita o confiar en la regla de ámbito local, que acaban de demostrar.

Si desea una variable estática que es individual para cada clase que utiliza una - se puede utilizar una clase de plantilla
. Por ejemplo,

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'
};
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top