2013-04-28 50 views
0

在C++中,如何創建一個變量常量,然後在構造函數中賦值給它?我想這樣做的原因是因爲我試圖使用數據驅動設計,將所有數據放入XML文件中,然後將該數據加載到變量中。問題是我無法加載初始化列表中的值,因此我必須在構造函數(或其他地方)中執行此操作,但這些變量不是常量。分配給構造函數中的常量變量?

下面是一個XML文件:

<weapons> 
    <pistol> 
     <damage>5.0</damage> 
     ... 
    </pistol> 
    ... 
</weapons> 

然後我有一個類,如:

class Weapon 
{ 
public: 
    Weapon(); 
    const float damage; 
}; 

#include "Weapon.h" 
Weapon::Weapon() 
{ 
    //load damage value into damage variable 
} 

由於損傷變量是不斷我可以'在構造函數中只對initializer列表做任何事情,但顯然我不能執行代碼,比如在初始化程序列表中讀取XML文件。所以,即使變量永遠不會改變,我應該不讓它保持不變或者有沒有一種正確的方法讓它保持不變,並做我所需要的?

+0

爲什麼你不能在初始化列表中執行那樣的代碼?只需編寫一個免費的常規函數​​(最好在Weapon.cpp中的匿名名稱空間中),解析出損壞值並將其返回。然後,在初始化損壞變量時,您可以在啓動器列表中調用該函數。哦,請把它變成私人的。 – rohitsan 2013-04-29 00:34:45

+0

是的,我其實沒有考慮到我的評論接受答案。是的,我會把它變成私人的。 – ProgrammerGuy123 2013-04-29 01:05:44

+0

可能重複[在構造函數中這個奇怪的冒號成員語法是什麼?](http://stackoverflow.com/questions/1711990/what-is-this-weird-colon-member-syntax-in-the-constructor ) – 2013-04-29 04:24:57

回答

1

你可以有一個XML解析器,例如:

class WeaponXMLParser 
{ 
public: 
    WeaponXMLParser(const std::string& filename); 
    float getDamage(); 
}; 

在初始化列表初始化const成員:

Weapon::Weapon(const WeaponXMLParser& wxp) : damage(wxp.getDamage()) 
{ 
} 
+0

沒想到我可以調用一個函數來在初始化列表中返回一個值。當我說「顯然我不能執行代碼就像在初始化程序列表中讀取XML文件」時,我猜測我錯了。 – ProgrammerGuy123 2013-04-28 23:57:02

2

使用初始化列表:

#include "Weapon.h" 
Weapon::Weapon() : damage(3.4) 
{ 
} 
+0

這個問題的字面意思是「問題是我無法加載初始化列表中的值」。這是缺少初始化表達式是執行加載的函數調用的位,而不是單純的編譯時常量。 – MSalters 2013-04-30 00:30:59

0

構造的身體確實運行爲時已晚,你const成員已經有一個值。是來自初始化列表

Weapon::Weapon() 
    : damage(0.0f) // 0.0f is the default value 
{ 
} 

在你的情況,你必須從XML文件,例如得到它

float Weapon::LoadDmgFromXML(); 
Weapon::Weapon() 
     : damage(LoadDmgFromXML()) 
{ 
} 
+0

仍值初始化,8.5/7表示「(可能是cv資格)」即cv資格沒有區別。而這又意味着對非類非數組類型進行了零初始化,這最終意味着0(零),作爲一個整型常量表達式,轉換爲浮點型。但是這不符合評論。 – MSalters 2013-04-28 23:50:10

0

一種方法是使用「構建器」類。所以你的情況你可能有適當的方法WeaponBuilder,可以讓你做到這一點:

WeaponBuilder wb(xmlFilename); 
Weapon w(wb); 

那麼一切都將成爲武器的構造函數中使用,這樣就可以做出適當的事情常量。

0

你必須這樣做在初始化列表。你可以提供將確定什麼傷害,並返回它的功能,所以你可以設置你的常量變量:

class Weapon 
{ 
public: 
    Weapon():damage(damage_xml()){} 
    const float damage; 
private: 
    float damage_xml(); 
}; 
-1

你可以用const_cast,使非const的參考const的變量。

float &_damage = const_cast<float&>(damage); 
_damage = 12.34; 
+0

這是未定義的行爲。 -1 – David 2013-04-29 00:05:56

+0

並讓您的程序崩潰並燒燬。 – chris 2013-04-29 00:05:56