2014-02-16 78 views
0

的静态成员看一看下面的代码:麻烦访问类

//abc.h

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

//abc.cpp

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

//主.cpp

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

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

[email protected]:~/test$ g++ main.cpp 
/tmp/ccREguak.o:main.cpp:function main: error: undefined reference to 'abc::a' 
collect2: error: ld returned 1 exit status 

请帮助我究竟做错了什么。

+3

你没有链接文件abc.cpp。将它添加到你的编译命令行。 – Mat

+1

“写操作每次都在阅读之前发生” - 不在您发布的代码中。 – Mat

+0

修复了这个问题...谢谢你 – Anvith

回答

0

好的,你有一个类的abc有一个静态成员a和一个函数init()。你的程序中没有的东西(在你的例子中是主要的)是类abc的任何实际的实例。因此:

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

b。链接器不会将abc :: a包含到最终的程序中 - 我认为除非至少有一个相关对象存在,否则永远不会获得静态成员变量。

那么你至少应该加上:

abc g_abc; 
g_abc.init(); 

里面的main()的COUT之前。

此外,作为垫说,你需要链接abc.cpp到你的项目,否则你没有ABC ::一个或ABC ::的init()里面的程序。

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