今天写代码时用了下C++中的静态成员变量,发现了一个以前不注意的现象,特此记录下。有类如下:
class AudioPlay
{
public:
static AudioPlay* get();
static int a;
virtual ~AudioPlay();
private:
AudioPlay();
};
AudioPlay::AudioPlay(){
}
AudioPlay::~AudioPlay(){
}
AudioPlay* AudioPlay::get() {
static AudioPlay ap;
a = 3;
return ≈
}
以上代码编译通过,但是链接时说无法解析这个静态变量a。这让我很不理解,a明明是类中的静态成员变量,为什么会无法解析呢?如果说是一般的成员变量还可以理解,而这里a是静态成员变量,不应该啊!?
AudioPlay* AudioPlay::get() {
static AudioPlay ap;
AudioPlay::a = 3;
return ≈
}
难道是访问a必须要加入类名作用域符?于是我又按上面这样进行编译,还是老问题。
int AudioPlay::a = 0;
AudioPlay* AudioPlay::get() {
static AudioPlay ap;
a = 3;
return ≈
}
后来发现,必须要在类外先定义一下才行,如上。
其实,类外的“int AudioPlay::a = 0;”这一行才是真正的定义,类中的“static int a;”只是声明了一下,所以会无法解析。
除了这种方式,在类内用const修饰符进行修饰的话,就可以免去类外的定义了,如下,但是这样a就不能变化了。
class AudioPlay
{
public:
static AudioPlay* get();
static const int a;
virtual ~AudioPlay();
private:
AudioPlay();
};
此外,也可以用内联来取代外部定义,但是需要C++17支持。
版权声明:本文为taotaost原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。