当一个静态成员变量在类中声明为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
答案 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
(朋友)中的函数操纵。