在构造函数中分配给常量变量?

时间:2013-04-28 23:36:34

标签: c++ initialization const

在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文件这样的代码。所以,即使变量永远不会改变,我是不是要让它保持不变,还是有一种正确的方法让它保持不变并做我需要的东西?

6 个答案:

答案 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;