1

可能重复:
对静态成员变量
的未定义引用什么是未定义引用/未解决的外部符号错误,我该如何解决?

#include<iostream>
using namespace std;

class abc {

    private:
    static int a ;

    public:

    abc(int x) {
        a = x;
    }

    void showData() {
        cout<<"A = "<<a<<endl;
    }
};

int main() {
    abc a1(4);
    abc a2(5);

    a1.showData();
    a2.showData();

    return 0;
}

当我尝试在 Ubuntu 上使用 GCC 编译器编译这个函数时。我收到以下错误。

/tmp/ccCKK2YN.o: In function `main':
static1.cpp:(.text+0xb): undefined reference to `Something::s_nValue'
static1.cpp:(.text+0x14): undefined reference to `Something::s_nValue'
collect2: ld returned 1 exit status
Compilation failed.

以下代码运行良好

#include<iostream>
using namespace std;

class Something
{
public:
    static int s_nValue;
};

int Something::s_nValue = 1;

int main()
{
    Something cFirst;
    cFirst.s_nValue = 2;

    Something cSecond;
    std::cout << cSecond.s_nValue;

    return 0;
}

这是因为静态成员变量需要在通过对象访问它们之前显式初始化。为什么会这样?

4

3 回答 3

1

static int s_nValue;不分配任何存储来存储 int,它只是声明它。

您在内存中分配某个位置来存储变量:

int Something::a=0;
于 2012-10-29T16:30:14.090 回答
0

在类的成员列表中声明静态数据成员不是定义。您必须在命名空间范围内的类声明之外定义静态成员。

看到这个线程

简而言之,静态成员需要在.cpp文件的某处进行初始化,以便编译器为其分配空间。声明如下所示:

int abc::a = 0;
于 2012-10-29T16:30:04.010 回答
0

这是因为静态成员在类的所有实例之间共享,因此需要在一个地方声明它们。

如果您在类声明中定义静态变量,那么include该文件的每个变量都会对该变量进行定义(这与static含义相反)。

因此,您必须在.cpp.

于 2012-10-29T16:31:19.690 回答