2012-03-09 24 views
0

下面的代碼編譯得很好。但是當去連接,爲什麼下面的代碼編譯得很好,但使用靜態鏈接時顯示錯誤

它顯示了以下錯誤

Undefined symbols for architecture x86_64: 
    "derived::counter", referenced from: 
    derived::getAddressCounter()  in main.cpp.o 
    ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 

我懷疑有什麼錯誤與靜態。但不知道爲什麼。因爲一旦我拿出靜態,代碼鏈接很好。但是靜態在這個代碼中扮演什麼角色?

#include <iostream> 
#include <string> 

struct base_result { }; 
struct result : public base_result { 
    int a; 
    std::string b; 
}; 


struct base { 
    static base_result counter; 

}; 

struct derived: public base { 
    static result counter; 

    result * getAddressCounter(){ 
     counter.a = 10; 
     counter.b = "haha"; 
     return &counter; 
    } 
}; 

int main(){ 
    derived d; 
    result * ptr; 

    ptr = d.getAddressCounter(); 

    ptr->a = 20; 
    ptr->b = "baba"; 
    std::cout << ptr->a << std::endl; 

    std::cout << ptr->b << std::endl; 
    return 0; 
} 

回答

3
struct base 
{ 
    static base_result counter; 
}; 

只有聲明靜態成員,您還需要定義一次在你的CPP文件。

良好閱讀: What is the difference between a definition and a declaration?

+0

太好了,謝謝。 – 2012-03-09 07:54:13

+0

因此,一個實例變量的正常定義將變成聲明,如果它是靜態變量? – 2012-03-09 08:07:27

+0

沒關係我知道了 – 2012-03-09 08:11:13

1

相較於成員變量,讓每一個創建對象的預留空間,靜態變量不能只是聲明,他們需要的是執行/太定義

base_result base::counter; 
result derived::counter; 

只需添加到您的代碼,它會編譯就好了。這些行指示編譯器實際保留空間來存儲先前聲明的靜態變量。

+0

希望我可以選擇兩個答案 – 2012-03-09 08:11:34

相關問題