简体   繁体   中英

static member variable when declared private

When a static member variable is declared private in a class, how can it be defined?

Suppose i have the following class declaration

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

Then the following statement to define a will result in compilation error.

int static_demo::a;

So is it possible to have a static data member in the private section of class?

Adding full code as per 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;
}

The compilation error is:

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

When a static member variable is declared private in a class, how can it be defined?

In the very same way as you define a public static variable in your source(cpp) file.

int static_demo::a = 1;

Access specifiers will not give you error while defining the member. Access specifiers control the access of the member variables, defining a static variable is an excpetion which is allowed.

Compiles cleanly on Ideone here .

EDIT: To answer your Q after you posted code.
Your problem is not the definition of the static member. The error is because you are trying to access the private static member inside main . You cannot do that.

Private members of a class can only be accessed inside the class member functions, the same rule applies even to static members. To be able to modify/access your static members you will have to add a member function to your class and then modify/access the static member inside it.

in your .cpp:

int static_demo::a(0);

when this causes an error, it is most common that you either encountered a linker error for a multiply defined symbol (eg the definition was in the header), or that you may have tried to define it in the wrong scope. that is, if static_demo is in the namespace MON , it would be defined in the .cpp:

#include "static_demo.hpp"
int MON::static_demo::a(0);

for other types, it may simply have been an incorrect constructor.

The problem is not the definition, but the fact that in main() (that's not in the name scope of static_demo, and cannot see a being private), you do an assignment .

The definition of a is what you did at global scope, with int static_demo::a; . You simply need an initializer, if you want a not to start with an undefined value.

int static_demo::a = 1;

will solve the problem.

From than on, a can be manipulated only by functions in static_demo (of friend of it).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM