6

プログラム全体で参照する必要があるさまざまな定数があります。グローバル変数を使用するのではなく、static const クラス メンバーを使用しています。

class Human
{
public:
    static const int HANDS = 2;
    static const int FINGERS = 10;
};

問題は、XML データ ファイルから値を読み取る必要があることです。関数を使用して静的メンバーを初期化できることを知っています。

const int Human::HANDS = ReadDataFromFile();

初期化の順序は同じコンパイル単位でしか予測できないため、それらすべてを同じ CPP ファイルで定義する必要があります。それは実際には問題ではありませんが、少し混乱します。

本当の問題は、コードを実行する前に、ReadDataFromFile() 関数内のすべてを使用できるようにする必要があることです。たとえば、ファイルからの XML データの読み取りを通常処理する XML クラスがあります。ただし、XML クラス オブジェクトが構築される前に静的メンバーが初期化されるため、この場合は使用できません。

どこでもランダムなグローバル変数を除いて、定数を整理するためのより良い解決策はありますか?

4

2 に答える 2

5

変数を初期化しようとするときは、XML ファイルを読み取る必要があります。staticただし、関数内のオブジェクトを使用してそれを取得できます。

XMLData const& access_config_file() {
    static XMLData data = readXMLData();
    return data;
}

access_config_file()その後、アクセスする必要がある場所から参照して、値を引き出すことができます。static変数は、関数が最初に呼び出されたときに初期化されます。

于 2012-10-15T21:54:02.543 に答える
3

このクラスでも、XML クラス オブジェクトを静的メンバーにします。つまり、

class Human
{
public:
    static XMLReader x;
    static const int HANDS;
    static const int FINGERS;
};

次に、実装ファイルで、これらの静的メンバーの定義を提供します。つまり、

XMLReader Human::x();
const int Human::HANDS= x.ReadDataFromFile();
const int Human::FINGERS =x.ReadDataFromFile();
于 2012-10-15T22:17:02.983 に答える