Rumah > pembangunan bahagian belakang > C++ > Mengapakah Saya Tidak Boleh Memulakan Ahli Kelas Terbitan Menggunakan Pemula Ditetapkan dalam C 20?

Mengapakah Saya Tidak Boleh Memulakan Ahli Kelas Terbitan Menggunakan Pemula Ditetapkan dalam C 20?

Barbara Streisand
Lepaskan: 2024-10-29 14:44:02
asal
446 orang telah melayarinya

Why Can't I Initialize Derived Class Members Using Designated Initializers in C  20?

Pemula Ditetapkan dalam C 20: Permulaan Kelas Terbitan

Pemula yang ditetapkan, diperkenalkan dalam C 20, membenarkan pengamulaan tepat ahli kelas menggunakan senarai-pemula yang ditetapkan. Walau bagaimanapun, soalan baru-baru ini menerangkan tentang tingkah laku yang tidak dijangka dengan kelas terbitan.

Soalan:

Kod berikut menggambarkan isu:

<code class="cpp">struct Person {
    std::string name{};
    std::string surname{};
    unsigned age{};
};

struct Employee : Person {
    unsigned salary{10000};
};

int main() {
    Person p{.name{"John"}, .surname{"Wick"}, .age{40}}; // Ok
    Employee e1{.name{"John"}, .surname{"Wick"}, .age{40}, .salary{50000}}; // Doesn't compile
    Employee e2{.salary{55000}}; // Warning: missing initializer for base class
}</code>
Salin selepas log masuk

Mengapakah pemulaan Pekerja dengan pemula yang ditetapkan gagal dan menghasilkan amaran untuk pemula yang hilang?

Jawapan:

Mengikut Standard C 20 (9.3.1 Agregat, hlm. #3), apabila menggunakan pemula yang ditetapkan, setiap pengecam dalam penentu mesti menamakan ahli data bukan statik langsung bagi kelas. Ini menunjukkan bahawa ahli kelas asas tidak boleh dimulakan menggunakan pemula yang ditetapkan.

Oleh itu, memulakan Pekerja menggunakan pemula yang ditetapkan, seperti dalam kes e1, adalah tidak betul dan harus diganti dengan sama ada pemula senarai atau pemulaan bersarang sebagai berikut:

<code class="cpp">Employee e1{"John", "Wick", 40, 50000}; // List initialization
Employee e2{{"John", "Wick", 40}, 50000}; // Nested initialization
Employee e1{{.name{"John"}, .surname{"Wick"}, .age{40}}, 50000}; // Nested initialization with designated initializer for base class</code>
Salin selepas log masuk

Dalam contoh terakhir, kelas asas Orang dimulakan menggunakan senarai pemula yang ditetapkan dalam pemulaan bersarang.

Atas ialah kandungan terperinci Mengapakah Saya Tidak Boleh Memulakan Ahli Kelas Terbitan Menggunakan Pemula Ditetapkan dalam C 20?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan