在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
}
因为损坏变量是常量我在构造函数中不能对它做任何事情,只能在初始化列表中,但显然我不能执行像读取初始化列表中的XML文件这样的代码。所以,即使变量永远不会改变,我是不是要让它保持不变,还是有一种正确的方法让它保持不变并做我需要的东西?
答案 0 :(得分:2)
使用初始化列表:
#include "Weapon.h"
Weapon::Weapon() : damage(3.4)
{
}
答案 1 :(得分:1)
你可以有一个xml解析器,例如:
class WeaponXMLParser
{
public:
WeaponXMLParser(const std::string& filename);
float getDamage();
};
初始化初始化列表中的const成员:
Weapon::Weapon(const WeaponXMLParser& wxp) : damage(wxp.getDamage())
{
}
答案 2 :(得分:0)
构造函数的主体确实运行得太晚,您的const
成员已经有了值。来自初始化列表:
Weapon::Weapon()
: damage(0.0f) // 0.0f is the default value
{
}
在您的情况下,您必须从XML文件中获取它,例如
float Weapon::LoadDmgFromXML();
Weapon::Weapon()
: damage(LoadDmgFromXML())
{
}
答案 3 :(得分:0)
一种方法是使用&#34;构建器&#34;类。因此,在您的情况下,您可能会使用适当的方法让WeaponBuilder执行此操作:
WeaponBuilder wb(xmlFilename);
Weapon w(wb);
然后一切都可以在武器的构造函数中使用,这样你就可以使const成为适当的东西。
答案 4 :(得分:0)
您必须在初始化列表中执行此操作。并且您可以提供一个函数来确定损坏是什么并将其返回,因此您可以设置const变量:
class Weapon
{
public:
Weapon():damage(damage_xml()){}
const float damage;
private:
float damage_xml();
};
答案 5 :(得分:0)
您可以使用const_cast并对const变量进行非const引用。
float &_damage = const_cast<float&>(damage);
_damage = 12.34;