Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ralat kompilasi C++: ahli statik tidak boleh dimulakan dengan ungkapan malar, bagaimana untuk menyelesaikannya?

Ralat kompilasi C++: ahli statik tidak boleh dimulakan dengan ungkapan malar, bagaimana untuk menyelesaikannya?

王林
王林asal
2023-08-22 08:13:101487semak imbas

Dalam pengaturcaraan C++, ahli statik ialah sifat awam kelas Mereka boleh diakses tanpa bergantung pada objek tertentu, kerana kitaran hayatnya adalah sama dengan kelas, dengan hanya satu salinan. Tetapi apabila menggunakan ahli statik, kadangkala anda akan menghadapi ralat kompilasi yang ahli statik tidak boleh dimulakan dengan ungkapan tetap. Jadi bagaimana ralat ini berlaku dan bagaimana untuk menyelesaikannya? Artikel ini akan memperkenalkannya dari dua aspek.

1. Sebab ahli statik tidak boleh dimulakan dengan ungkapan malar

Dalam standard C++11, konsep constexpr ungkapan malar diperkenalkan, yang merujuk kepada ungkapan yang hasilnya boleh dikira pada masa penyusunan. Pemalar boleh ditakrifkan menggunakan constexpr, sebagai contoh:

constexpr int max(int a, int b) {
    return a > b ? a : b;
}

Apabila menggunakan fungsi ini, pengkompil boleh mengira hasil pada masa penyusunan, jadi max(1, 2) boleh dianggap sebagai ungkapan malar. Hasilnya ialah 2. Tetapi apabila menggunakan ahli statik, jika anda cuba menggunakan ungkapan malar untuk memulakan pembolehubah ahli statik, ralat kompilasi akan berlaku. Contohnya:

class MyClass {
public:
    static constexpr int m_value = 10; // 编译错误
};

Ini kerana susunan pemulaan ahli statik berkaitan dengan susunan penilaian ungkapan malar. Dalam C++, susunan permulaan ahli statik adalah dalam susunan pengisytiharan, dan ungkapan malar dinilai pada masa penyusunan, jadi jika ahli statik bergantung pada ungkapan malar, ia mesti dijamin untuk dimulakan selepas ungkapan malar. . a Ungkapan pemalar khas yang hanya melibatkan literal integer, pengendali aritmetik dan fungsi atau ahli tanpa kesan sampingan. Untuk pembolehubah ahli statik, anda boleh menggunakan ungkapan pemalar integer untuk memulakan, contohnya:

class MyClass {
public:
    static const int m_value = 10; // 正确
};

Untuk jenis pembolehubah ahli statik yang lain, anda juga boleh menggunakan kaedah ini, cuma pastikan anda menggunakan ungkapan pemalar integer untuk pemula.

2. Gunakan pembolehubah sebaris

Dalam piawaian C++17, konsep pembolehubah sebaris diperkenalkan, yang membolehkan pembolehubah ditakrifkan dalam fail pengepala tanpa menyebabkan masalah definisi berbilang. Untuk pembolehubah ahli statik, anda boleh menggunakan pembolehubah sebaris untuk memulakan, contohnya:

class MyClass {
public:
    inline static int m_value = 10; // 正确
};

Menggunakan pembolehubah sebaris boleh mengelakkan masalah bahawa ahli statik tidak boleh dimulakan dengan ungkapan malar Ia juga lebih mudah dan tidak perlu mentakrifkan pembolehubah secara berasingan fail sumber. . rujukan dan kemudian memulakannya apabila anda perlu menggunakan pembolehubah ahli statik boleh mengelakkan masalah bahawa ahli statik tidak boleh dimulakan dengan ungkapan malar. Kelebihan pendekatan ini ialah anda boleh mengawal pemasaan permulaan pembolehubah ahli statik secara fleksibel mengikut keperluan, sambil juga mengelakkan pengamulaan yang tidak perlu apabila program bermula. . Sebab masalah ini ialah susunan permulaan ahli statik berkaitan dengan susunan penilaian ungkapan malar. Untuk menyelesaikan masalah ini, anda boleh menggunakan ungkapan pemalar integer untuk memulakan ahli statik, menggunakan pembolehubah sebaris untuk memulakan ahli statik atau menggunakan pengamulaan malas untuk mengelakkan masalah bahawa ahli statik tidak boleh dimulakan dengan ungkapan malar. Kaedah yang mana untuk dipilih bergantung pada situasi tertentu dan perlu dipilih secara fleksibel berdasarkan keperluan sebenar.

Atas ialah kandungan terperinci Ralat kompilasi C++: ahli statik tidak boleh dimulakan dengan ungkapan malar, bagaimana untuk menyelesaikannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn