【问题标题】:Can non-static member function access static member function or data?非静态成员函数可以访问静态成员函数或数据吗?
【发布时间】:2013-05-03 14:15:38
【问题描述】:

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

#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

【问题讨论】:

标签: c++ class static


【解决方案1】:

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

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

int test::a = 0;

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

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

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

【讨论】:

  • 值得添加“不要把它放在头文件中”,因为不是每个人都知道“编译单元”是什么意思。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    你需要做类似int test:: a; 来定义它。

    也见this

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

    【讨论】:

      【解决方案4】:

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

      int test::a;
      

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

      【讨论】:

      • 在哪里定义并不重要。
      • @Elazar:这是一个循环论证,因为如果你试图把它放在非法的地方,它就不会被定义;-P。我对上述main 的建议是确保在main()(这将构成另一个声明)内、class test 之前或内部都没有尝试定义@....
      • @elazar 这并不完全正确。它所属的类的声明需要是可见的。
      • @TonyD 然后编辑您的答案以反映这一点,否则会产生误导。
      • @Elazar:我认为“误导”有点强烈......但没有害处,所以已经澄清了。干杯。也许你应该建议 Nbr44 对“如果你把这一行放在你的类声明下,它会解决你的问题。”做类似的改变......?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多