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

たとえば、次のような xml パーサーを使用できます。

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

初期化リストの const メンバーを初期化します。

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

const_cast を使用して、const 変数への非 const 参照を作成できます。

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

1 つのアプローチは、「ビルダー」クラスを使用することです。したがって、あなたの場合、これを可能にする適切なメソッドを備えた WeaponBuilder があるかもしれません:

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

次に、武器のコンストラクターですべてが利用可能になるため、適切なものを const にすることができます。

于 2013-04-28T23:44:54.310 に答える
0

イニシャライザリストで行う必要があります。また、損傷が何であるかを判断して返す関数を提供できるため、const 変数を設定できます。

class Weapon
{
public:
    Weapon():damage(damage_xml()){}
    const float damage;
private:
    float damage_xml();
};
于 2013-04-28T23:46:47.863 に答える
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 に答える