Pertanyaan anggota kelas const statis


Saya memiliki berbagai konstanta yang perlu saya rujuk di seluruh program saya. Daripada menggunakan variabel global, saya telah menggunakan anggota kelas statis const:

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

Masalahnya adalah saya harus membaca nilai dari file data XML. Saya tahu bahwa saya dapat menginisialisasi anggota statis dengan fungsi:

const int Human::HANDS = ReadDataFromFile();

Karena urutan inisialisasi hanya dapat diprediksi dalam unit kompilasi yang sama, saya harus mendefinisikan semuanya dalam file CPP yang sama. Itu tidak benar-benar masalah tetapi menjadi sedikit berantakan.

Masalah sebenarnya adalah bahwa semua fungsi ReadDataFromFile () saya harus siap digunakan sebelum kode saya memiliki kesempatan untuk dijalankan. Sebagai contoh, saya memiliki kelas XML yang biasanya menangani membaca data XML dari file. Saya tidak dapat menggunakannya dalam kasus ini, karena anggota statis diinisialisasi sebelum objek kelas XML saya dibangun.

Selain variabel global acak di mana-mana, apakah ada solusi yang lebih baik untuk mengatur konstanta?


6
2017-10-15 21:47


asal


Jawaban:


Anda harus memiliki file XML Anda dibaca ketika Anda mencoba menginisialisasi variabel. Namun, Anda bisa mendapatkannya menggunakan static objek di dalam suatu fungsi:

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

Anda kemudian dapat referensi access_config_file() dari mana pun Anda perlu mengaksesnya dan menarik nilai keluar. Itu static variabel diinisialisasi saat pertama kali fungsi dipanggil.


5
2017-10-15 21:54



Jadikan objek kelas XML Anda sebagai anggota statis di kelas ini juga. yaitu.,

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

Kemudian dalam file implementasi, Anda memberikan definisi dari anggota statis ini, yaitu,

XMLReader Human::x();
const int Human::HANDS= x.ReadDataFromFile();
const int Human::FINGERS =x.ReadDataFromFile();

3
2017-10-15 22:17