Статическая переменная-член при объявлении приватной
Когда статическая переменная-член объявляется приватной в классе, как ее можно определить?
Предположим, что у меня есть следующее объявление класса
class static_demo
{
private:
static int a;
public:
static int b;
void set(int x, int y)
{
a = x;
b = y;
}
void show()
{
cout << "a = " << a << "\n";
cout << "b = " << b << "\n";
}
};
Тогда следующий оператор для определения a
приведет к ошибке компиляции.
int static_demo::a;
Итак, возможно ли иметь статический член данных в частной секции класса?
Добавление полного кода в соответствии с Greg,
#include <iostream>
using namespace std;
class static_demo
{
private:
static int a;
public:
static int b;
void set(int x, int y)
{
a = x;
b = y;
}
};
int static_demo::a;
int static_demo::b;
int main()
{
static_demo::b = 10;
static_demo::a = 20;
return 0;
}
Ошибка компиляции:
static_member_variable.cpp: In function `int main()':
static_member_variable.cpp:20: error: `int static_demo::a' is private
static_member_variable.cpp:26: error: within this context
Ответы
Ответ 1
Когда статическая переменная-член объявляется приватной в классе, как ее можно определить?
Точно так же, как вы определяете публичную статическую переменную в исходном файле (cpp).
int static_demo:: a = 1;
Спецификаторы доступа не будут давать вам ошибку при определении члена. Спецификаторы доступа управляют доступом к переменным-членам, определяя статическую переменную, которая разрешена.
Компилируется на Ideone здесь.
РЕДАКТИРОВАТЬ: Чтобы ответить на ваш вопрос после вашего опубликованного кода.
Ваша проблема не в определении статического члена. Ошибка заключается в том, что вы пытаетесь получить доступ к частному статическому элементу внутри main
. Вы не можете сделать это.
Частные члены класса могут быть доступны только внутри функций класса, то же правило применяется даже к статическим членам. Чтобы иметь возможность изменять/получать доступ к вашим статическим членам, вам нужно будет добавить функцию-член в свой класс, а затем изменить/получить доступ к статическому члену внутри него.
Ответ 2
в вашем .cpp:
int static_demo::a(0);
когда это вызывает ошибку, чаще всего вы столкнулись с ошибкой компоновщика для многократно определенного символа (например, определение было в заголовке) или что вы, возможно, пытались определить его в неправильной области. то есть, если static_demo
находится в namespace MON
, он будет определен в .cpp:
#include "static_demo.hpp"
int MON::static_demo::a(0);
для других типов, это может быть просто неправильный конструктор.
Ответ 3
Проблема не в определении, а в том, что в main() (который не входит в область имен static_demo и не может видеть a
), вы выполняете назначение.
Определение a
- это то, что вы делали в глобальной области, с int static_demo::a;
.
Вам просто нужен инициализатор, если вы хотите a
не начинать с значения undefined.
int static_demo::a = 1;
решит проблему.
От, чем on, a
можно манипулировать только функциями из static_demo
(его друга).