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
}

因为损坏变量是常量,所以我不能在构造函数中对它做任何事情,只能在初始化列表中,但显然我不能像在初始化列表中读取 XML 文件那样执行代码。因此,即使变量永远不会改变,我应该不让它保持不变还是有适当的方法让它保持不变并做我需要的?

4

6 回答 6

2

使用初始化列表:

#include "Weapon.h"
Weapon::Weapon() : damage(3.4)
{
}
于 2013-04-28T23:41:18.410 回答
1

You could have a xml parser, for example:

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

Initialize const member in initializers list:

Weapon::Weapon(const WeaponXMLParser& wxp) : damage(wxp.getDamage())
{
}
于 2013-04-28T23:45:26.090 回答
0

构造函数的主体确实运行得太晚了,您的const成员已经有了一个值。来自初始化列表

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

在您的情况下,您必须从 XML 文件中获取它,例如

float Weapon::LoadDmgFromXML();
Weapon::Weapon()
      :  damage(LoadDmgFromXML())
{
}
于 2013-04-28T23:41:26.307 回答
0

一种方法是使用“builder”类。因此,在您的情况下,您可能会使用带有适当方法的 WeaponBuilder 来执行此操作:

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

Then everything will be available in Weapon's constructor, so that you can make appropriate things const.

于 2013-04-28T23:44:54.310 回答
0

you must do it in initializer list. And you can provide a function that will determine what damage is and returns it, so you can set your const variable:

class Weapon
{
public:
    Weapon():damage(damage_xml()){}
    const float damage;
private:
    float damage_xml();
};
于 2013-04-28T23:46:47.863 回答
0

You could use const_cast and make a non-const reference to the const variable.

float &_damage = const_cast<float&>(damage);
_damage = 12.34;
于 2013-04-28T23:54:39.467 回答