5

我在网上搜索,发现有人说非静态成员函数可以访问静态成员函数或数据。然后我写了一个程序来验证它。

#include <iostream>
class test
{
public:
    static int a;
    void printa()
    {
        std::cout<<a;
    }
};

int main(int argc, const char * argv[])
{
    test m;
    m.printa();

    return 0;
}

代码生成链接器错误!

Undefined symbols for architecture x86_64:
  "test::a", referenced from:
      test::printa() in main.o
4

4 回答 4

8

将变量声明为static类内部只是一个声明。

您还需要定义变量,这意味着在单个编译单元中添加这一行:

int test::a = 0;

更准确地说:编译单元基本上是一个 .cpp 文件。您不应该将该行直接放在头文件中,否则您将得到相反的错误:“...的多重定义”。

正如您已经猜到的那样,这也将0在程序启动后将变量初始化为。

如果你把这一行放在你的类声明下,它将解决你的问题(在这种特定情况下:记住不要把它写在头文件中)。

于 2013-05-09T06:54:38.767 回答
2

那是因为你只声明了test::a,没有定义它:

#include <iostream>
class test
{
    ...
};

int test::a = 1; //Needs a definition!
于 2013-05-09T06:55:45.000 回答
1

您只声明了static数据成员。你还没有定义它。

你需要做一些类似int test:: a;定义它的事情。

也看到这个

允许非静态成员访问静态数据成员。不允许反向,因为静态成员不属于任何对象

于 2013-05-09T06:56:15.283 回答
0

您必须定义静态数据成员实例。添加一行...

int test::a;

...abovemain()或 under ... 基本上直接在与和 after的定义main()相同的命名空间范围内的任何地方。class testclass test

于 2013-05-09T06:55:32.513 回答