访问类的静态成员时遇到麻烦

时间:2014-02-16 11:03:19

标签: c++ class static-members

查看以下代码:

// abc.h

class abc{ 
      public:
        static int a;
        void init();
  };

// abc.cpp

#include"abc.h"
  int abc::a;
  void abc::init(){
    abc::a = 10;
  }

// main.cpp中

#include<iostream>
#include"abc.h"
   int main(){
  std::cout << abc::a;
  return 0;
 }

基本上我想要实现的是一个类写入静态变量而另一个类从中读取。写操作在每次读取之前发生。我收到以下错误:

anvith@anvdebian:~/test$ g++ main.cpp
/tmp/ccREguak.o:main.cpp:function main: error: undefined reference to 'abc::a'
collect2: error: ld returned 1 exit status

请帮助我确切地说我做错了什么。

1 个答案:

答案 0 :(得分:0)

好的,你有一个abc类,它有一个静态成员a和一个函数init()。您在程序中没有的(在您的示例中为main)是类abc的任何实际实例。因此:

一个。没有可以调用init()的abc实例。

湾链接器不会在最终程序中包含abc :: a - 我认为你永远不会得到静态成员变量,除非你在某处有至少一个相关对象。

所以至少应该添加:

abc g_abc;
g_abc.init();

在cout之前的main()内。

另外,正如Mat所说,你需要将abc.cpp链接到你的项目中,否则你在程序中没有abc :: a或abc :: init()。

你可能想要考虑一个构造函数,它在创建时初始化一个abc对象,但是如果构造函数唯一能做的就是设置a的值,这可能不是你想要的,因为它将被重置每次你做一个新的abc。你可以改变“int abc :: a;”这一行在abc.cpp中“int abc :: a = 0;”以便在程序启动时初始化。