非静态成员函数可以访问静态成员函数还是数据?

时间:2013-05-09 06:51:44

标签: c++ class static

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

#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 个答案:

答案 0 :(得分:8)

在一个类中声明一个变量为static,嗯,只有 一个声明。

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

int test::a = 0;

更确切地说:编译单元基本上是.cpp文件。您应该将该行直接放在头文件中,否则您将得到相反的错误:&#34;多个定义...&#34;。

正如您所猜测的那样,一旦您的程序启动,这也会将您的变量初始化为0

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

答案 1 :(得分:2)

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

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

int test::a = 1; //Needs a definition!

答案 2 :(得分:1)

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

你需要做int test:: a;之类的事情来定义它。

另见this

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

答案 3 :(得分:0)

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

int test::a;

...高于main(),或main()下...基本上在与class test相同的命名空间范围内和class test定义之后的任何地方。