Статическая переменная-член при объявлении приватной

Когда статическая переменная-член объявляется приватной в классе, как ее можно определить?

Предположим, что у меня есть следующее объявление класса

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 (его друга).