繁体   English   中英

非静态成员函数可以访问静态成员函数或数据吗?

[英]Can non-static member function access static member function or data?

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

#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

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

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

int test::a = 0;

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

如您所料,这也将在程序启动后将变量初始化为0

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

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

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

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

您只声明了static数据成员。 您尚未定义。

您需要执行类似int test:: a; 定义它。

也看到这个

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

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

int test::a;

...在main()之上或main() ...基本上在与class test相同的名称空间范围内以及在class test的定义之后的任何位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM