2016-03-11 72 views
2

我有一個具有靜態常量無符號整型變量的類。我想根據程序啓動時傳遞的參數來初始化這個變量。我創建了一個我想要做的事情的例子,試圖找出如何實現這一點。將值設置爲靜態常量unsigned int

的main.cpp

int main() { 
    const unsigned int legs = 4; 
    Dog dog(legs); 
    return 0; 
} 

Dog.h

class Dog { 
public: 
    Dog(const unsigned int legs); 
    ~Dog(); 
private: 
    static const unsigned int legs; 
}; 

Dog.cpp

Dog::Dog(const unsigned int l) : legs(l) { 

} 

Dog::~Dog() { 

} 

在主,我創建的變量,以模擬值從程序傳遞當它運行時。

編譯器提供了以下錯誤:

/home/jota/ClionProjects/Caca/Dog.cpp: In constructor ‘Dog::Dog(unsigned int)’: 
/home/jota/ClionProjects/Caca/Dog.cpp:7:34: error: ‘const unsigned int Dog::legs’ is a static data member; it can only be initialized at its definition 
Dog::Dog(const unsigned int l) : legs(l) { 
           ^
make[2]: *** [CMakeFiles/Caca.dir/Dog.cpp.o] Error 1 
make[1]: *** [CMakeFiles/Caca.dir/all] Error 2 
make: *** [all] Error 2 

我一直在尋找互聯網和鋸靜態const int的幾個例子在工作,我用它的方式,否則我可能失去了一些東西。我正在編譯-std=c++11

+0

標記變量作爲類的靜態成員意味着它是獨立於類的具體對象。你怎麼想當你創建該類的多個對象時這應該起作用? –

+0

由於變量在「main」被輸入之前被初始化,所以這會很困難。你一定誤解了你找到的例子。 – molbdnilo

回答

1

構造函數用於初始化一個具體的對象的字段。當你聲明static時,它屬於整個班級,而不是特別的一個對象。這就是爲什麼你不能在構造函數中實例化這個值的原因。

你可以刪除靜態,並有const unsigned int legs,但我猜你不想這樣,因爲所有的狗都有4條腿。

你可以在你Dog.cpp文件做其他更符合邏輯的事情是這樣的:

unsigned int Dog::legs = 4; 
+2

你是不是指'Dog :: legs = 4;'? btw不是每條狗都有4條腿。 – user463035818

+0

當然,我的意思是,謝謝@ tobi303。那麼,我可以imaganice一隻殘疾的狗,但我很確定所有的狗都有4條腿。如果他們有不同數量的腿,那麼使'腿'靜態是沒有意義的。 – Vucko

+0

是的,我同意,這是沒有意義的。 – user463035818

2

static字段是類的成員,不是實例的成員。在構造函數初始化列表中,您只能初始化對象的成員(當然還有超級對象),因此出現該錯誤。

更改的定義:

const unsigned int legs; 
1

不同於非靜態成員如此,

class A { 
public: 
    int a; 
}; 

int main(void) { 
    A a1, a2; 
    a1.a = 10; 
    a2.a = 20; 

    return 0; 
} 

class一個的static構件不是class的任何實例的一部分。這意味着在上面的示例中,如果astatic,a1a2不會每個都有其副本a

A staticclass的成員可以被認爲是存在於class範圍內的「全局」變量。

因此,要訪問一個classstatic會員,你這樣做:

class A { 
public: 
    static int a; 
}; 

int A::a = 0; //A static member variable needs to be defined in a translation unit(or .c/.cpp file) 

int main(void) { 
    A::a = 50; 

    return 0; 
}