Pergunta

EDIT: declarando-privada foi um erro de digitação, eu fixa-lo:

Com relação a outra pergunta, se eu declarou uma variável estática em uma classe, em seguida, derivada de uma classe de que, há alguma maneira de declarar a variável estática como individual por cada classe. Ou seja:

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

faz que definem dois diferentes variáveis ??estáticas x, um para um e um para B, ou será que eu recebo um erro de redefinição x, e se eu fizer um erro, como é que um eu criar duas variáveis ??estáticas separadas?

Foi útil?

Solução

Quando você estiver usando variáveis ??estáticas, pode ser uma boa idéia para se referir a eles explicitamente:

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

Dessa forma, mesmo se a classe "acima" seu na hierarquia decide criar um membro com mesmo nome, ele não vai quebrar seu código. Da mesma forma, eu costumo tentar nos a palavra-chave this ao acessar campos membros normais.

Atualização para utilizar sintaxe C ++.

Outras dicas

Isso cria duas variáveis ??estáticas separadas.

Note que você tenha declarado implicitamente estes privada:

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

O que significa que as variáveis ??não estão em concorrência uns com os outros.

Como já foi dito, que cria duas variáveis ??distintas:

A::x;

// and 

B::x;

De fato, se você tentar usar apenas 'x' em um método de B, somente a definição do escopo mais perto será usado até que você esteja mais preciso:

#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;
}

Saídas:

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

Alguém mencionou que a acessibilidade acessibilidade limite de poder: fazer a variável base privada não vai torná-lo acessível para a classe infantil. No entanto, se a variável tem que ser protegida ou pública, use um método de acesso explícita ou contar com a regra de âmbito local Eu só demonstrada.

Se você quer uma variável estática que é individual para cada classe que usa A - você pode usar uma classe de modelo
. Por exemplo

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top