声明私有时的静态成员变量

时间:2011-10-22 07:15:39

标签: c++ static-members

当一个静态成员变量在类中声明为private时,如何定义它?

假设我有以下类声明

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

3 个答案:

答案 0 :(得分:22)

  

当一个静态成员变量在类中声明为private时,如何定义它?

与在源(cpp)文件中定义公共静态变量的方式相同。

  

int static_demo :: a = 1;

访问说明符在定义成员时不会给您错误。访问说明符控制成员变量的访问,定义静态变量是允许的删除。

在Ideone here 上干净地编译。

编辑:在发布代码后回答您的问题 您的问题不是静态成员的定义。该错误是因为您尝试访问main中的私有静态成员。你不能这样做。

类的私有成员只能在类成员函数内访问,同样的规则甚至适用于静态成员。为了能够修改/访问静态成员,您必须向类中添加成员函数,然后修改/访问其中的静态成员。

答案 1 :(得分:2)

在.cpp中:

int static_demo::a(0);

当这会导致错误时,最常见的是您遇到了多重定义符号的链接器错误(例如,定义位于标头中),或者您可能尝试在错误的范围内定义它。也就是说,如果static_demo位于namespace MON,则会在.cpp中定义:

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

对于其他类型,它可能只是一个不正确的构造函数。

答案 2 :(得分:0)

问题不在于定义,而是在main()中(不在static_demo的名称范围内,并且看不到a是私有的),你做了赋值

a的定义是您在全球范围内使用int static_demo::a;所做的。 如果您希望a不以未定义的值开头,则只需要一个初始化程序。

int static_demo::a = 1;

将解决问题。

a只能由static_demo(朋友)中的函数操纵。