Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Memulakan Tatasusunan Objek Tanpa Pembina Lalai?

Bagaimana untuk Memulakan Tatasusunan Objek Tanpa Pembina Lalai?

Mary-Kate Olsen
Lepaskan: 2024-12-27 06:15:12
asal
785 orang telah melayarinya

How to Initialize Object Arrays Without a Default Constructor?

Memulakan Tatasusunan Objek Tanpa Pembina Lalai

Tatasusunan objek biasanya digunakan dalam pengaturcaraan, tetapi isu mungkin timbul apabila memulakannya dengan kelas yang tidak mempunyai pembina lalai . Pertimbangkan kod berikut:

class Car {
private:
  Car(){};  // Private default constructor
  int _no;
public:
  Car(int no) {
    _no = no;
  }
};
Salin selepas log masuk

Dalam kelas ini, pembina lalai (Kereta()) adalah peribadi, yang bermaksud objek jenis Kereta tidak boleh dibuat tanpa memberikan hujah. Walau bagaimanapun, apabila memulakan tatasusunan objek Kereta, pengkompil cuba memanggil pembina lalai untuk setiap elemen, yang membawa kepada ralat:

cartest.cpp:5: error: ‘Car::Car()’ is private
cartest.cpp:21: error: within this context
Salin selepas log masuk

Penyelesaian Menggunakan Peletakan-Baharu

Untuk mengatasi masalah ini, penempatan-baru boleh digunakan. Placement-new membolehkan kami memperuntukkan memori dan membina objek secara langsung di lokasi memori tersebut tanpa menggunakan pembina objek. Begini cara ia boleh dilaksanakan:

int main() {
  void *raw_memory = operator new[](NUM_CARS * sizeof(Car));  // Allocate raw memory
  Car *ptr = static_cast<Car *>(raw_memory);  // Cast to a pointer to Car
  for (int i = 0; i < NUM_CARS; ++i) {
    new(&amp;ptr[i]) Car(i);  // Call placement-new to construct Car objects in-place
  }
}
Salin selepas log masuk

Dengan menggunakan penempatan-baru, kita boleh memulakan tatasusunan objek tanpa memanggil pembina lalai secara eksplisit. Objek dicipta dan diletakkan terus ke dalam memori yang diperuntukkan.

Kelebihan Mengelakkan Pembina Lalai

Seperti yang dinyatakan dalam Item 4 "C Lebih Berkesan" Scott Meyers, mengelakkan pembina lalai yang tidak sepatutnya boleh meningkatkan ketepatan dan kebolehselenggaraan program. Pembina lalai sering membawa kepada kekaburan dalam reka bentuk kelas dan boleh menjadikannya mencabar untuk menguatkuasakan invarian kelas. Dengan mentakrifkan pembina secara eksplisit, pengaturcara menegaskan bahawa objek kelas itu hanya boleh dibuat dengan set argumen tertentu, memastikan kawalan dan kejelasan yang lebih baik.

Atas ialah kandungan terperinci Bagaimana untuk Memulakan Tatasusunan Objek Tanpa Pembina Lalai?. 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