正文:

我们知道,静态成员变量和静态成员函数都是独立于类的实例存在的,即便类实例不存在,静态成员变量和函数都是可以独立访问的。这是因为其内存特殊性而导致的。

然而有些时候会把函数的实现写在h文件里,这个时候在使用static成员变量和函数的时候就需要注意,h文件会被编译器认为是声明,因此如果在类中写 static int i;,则编译器会认为这是声明而不是定义,因此 i 实际上并不存在于内存中,这个时候如果在 h 文件的 静态成员函数中访问 i 则会报错 undefined reference to 。 

解决方法有两种:

1)在类声明之外定义这个 static 成员变量,但是定义必须要在cpp文件中做;

A.h
class A
{

static int i;
static void func()
{
i++;
}

}

A.cpp
static int A::i;

2)在静态成员函数里面直接定义和使用 static 成员变量。

A.hpp

class A
{

static void func()
{
static int i;
i++;
}

}

参考:

​undefined reference to static private me - C++ Forum​