2014-02-16 104 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。