Как объявить две разные статические переменные?(С++)
-
14-09-2019 - |
Вопрос
РЕДАКТИРОВАТЬ:объявление их частными было опечаткой, я исправил ее:
Что касается другого вопроса: если я объявил статическую переменную в классе, а затем получил от нее класс, есть ли способ объявить статическую переменную как индивидуальную для каждого класса.Т.е.:
class A:
{
public:
static int x;
};
class B:A
{
public:
const static int x;
};
это определяет ДВЕ РАЗНЫЕ статические переменные x
, один для A и один для B, или я получу ошибку при переопределении x
, и если я получу ошибку, как мне создать две отдельные статические переменные?
Решение
Когда вы используете статические переменные, было бы неплохо ссылаться на них явно:
public class B:A
{
public const static int x;
public int foo()
{
return B::x;
}
}
Таким образом, даже если класс «выше» вашего в иерархии решит создать член с таким же именем, это не нарушит ваш код.Точно так же я обычно стараюсь this
ключевое слово при доступе к обычным полям-членам.
Обновлено использовать синтаксис C++.
Другие советы
Это создает две отдельные статические переменные.
Обратите внимание, что вы неявно объявили эти частные:
class A:
{
private:
static int x;
};
class B:A
{
private:
const static int x;
};
Это означает, что переменные не конкурируют друг с другом.
Как уже было сказано, при этом создаются две отдельные переменные:
A::x;
// and
B::x;
Фактически, если вы попытаетесь использовать только «x» в методе B, будет использоваться только определение более близкой области, пока вы не станете более точным:
#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;
}
Выходы:
A::x = 7
B::x = 42
b's x = 42
Кто-то упомянул, что доступность может ограничивать доступность:если сделать базовую переменную частной, она не станет доступной для дочернего класса.Однако, если переменная должна быть защищена или общедоступна, используйте явный метод доступа или полагайтесь на правило локальной области, которое я только что продемонстрировал.
Если вам нужна статическая переменная, индивидуальная для каждого класса, использующего A, вы можете использовать класс шаблона.
Например,
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'
};