Isi kandungan:

Cara Melakukan Corak Reka Bentuk Singleton dalam Langkah C ++: 9
Cara Melakukan Corak Reka Bentuk Singleton dalam Langkah C ++: 9

Video: Cara Melakukan Corak Reka Bentuk Singleton dalam Langkah C ++: 9

Video: Cara Melakukan Corak Reka Bentuk Singleton dalam Langkah C ++: 9
Video: Refactoring: Singleton [Pola Desain] 2024, November
Anonim
Cara Melakukan Corak Reka Bentuk Singleton di C ++
Cara Melakukan Corak Reka Bentuk Singleton di C ++

Pengenalan:

Tujuan panduan arahan ini adalah untuk mengajar pengguna tentang bagaimana menerapkan corak reka bentuk singleton dalam program C ++ mereka. Dengan berbuat demikian, set arahan ini juga akan menjelaskan kepada pembaca mengapa unsur-unsur tunggal adalah cara mereka dan bagaimana kod tersebut diproses. Mengetahui hal ini, akan membantu di masa depan dengan menyahpepijatikan single masa depan anda. Apakah corak reka bentuk singleton? Corak reka bentuk singleton adalah corak reka bentuk di mana pengekod membuat kelas yang hanya dapat dibuat sekali, fungsi umum kelas pada dasarnya dapat diakses di mana saja, dengan syarat anda telah # memasukkan fail tajuk dalam fail yang berkaitan dengan projek lain.

Corak reka bentuk singleton adalah corak reka bentuk yang mesti diketahui untuk mana-mana pengaturcara berorientasikan objek, pengaturcara perisian, dan pengaturcara permainan. Corak reka bentuk singleton juga merupakan salah satu corak reka bentuk pengekodan termudah di luar sana. Mempelajarinya dapat membantu anda mempelajari corak reka bentuk lain yang lebih sukar di masa depan. Ini juga dapat membantu anda melancarkan kod program anda dengan cara yang anda rasa tidak mungkin.

Walaupun kesukaran corak reka bentuk singleton mudah jika dibandingkan dengan corak reka bentuk lain, set arahan ini mempunyai kesukaran sederhana. Ini bermaksud bahawa untuk mengikuti arahan ini, kami mengesyorkan agar anda mengetahui keperluan sintaks asas dan awal C ++. Anda juga harus mengetahui etika pengekodan C ++ yang betul (iaitu Menjaga pemboleh ubah kelas peribadi, satu kelas setiap fail tajuk dll). Anda juga harus tahu bagaimana membebaskan memori dan bagaimana pembina dan pemusnah berfungsi di C ++.

Panduan pengajaran ini akan mengambil masa sekitar 10-15 minit.

Keperluan Bahan:

- Komputer (boleh menjadi PC atau Mac) yang mampu menjalankan Visual Studios (versi apa pun)

-Program sederhana, dibuat di Visual Studios, yang dapat anda uji dengan single anda

Catatan: Corak reka bentuk singleton dapat dilakukan pada antara muka IDE atau pengkodan penyokong C ++ yang lain, tetapi untuk set arahan ini, kami akan menggunakan Visual Studios Enterprise Edition.

Langkah 1: Buat Kelas Anda, Dengan Fail Header dan CPP File

Buat Kelas Anda, Dengan Fail Header dan CPP File
Buat Kelas Anda, Dengan Fail Header dan CPP File
Buat Kelas Anda, Dengan Fail Header dan CPP File
Buat Kelas Anda, Dengan Fail Header dan CPP File

Untuk membuat dua fail dan kelas ini sekaligus, buka projek / program anda di Visual Studios, pergi ke penjelajah penyelesaian, klik kanan, dan kotak akan muncul di dekat kursor tetikus anda, cari pilihan "Tambah", arahkan kursor di atasnya, dan kotak lain akan muncul di sebelah kanan. Di kotak ini, anda ingin mencari pilihan "Item Baru..", klik dan tetingkap, menyerupai gambar 1.1 gambar di bawah, akan muncul. Di tetingkap ini anda ingin memilih "Kelas C ++" dan kemudian tekan "Tambah". Ini akan membuka tetingkap lain yang menyerupai gambar 1.2 gambar. Di tetingkap ini, anda menaip nama kelas anda di medan "Nama Kelas" dan Visual Studios akan secara automatik menamakan fail sebenar setelah nama kelas. Untuk tujuan arahan ini, kami akan menamakan kelas kami "EngineDebugSingleton", tetapi nama itu boleh berupa huruf. Anda kini boleh menekan "OK" dan teruskan ke langkah 2.

Catatan: Penjelajah penyelesaian dan tempat fail disimpan di komputer anda terpisah. Memindahkan atau membuat apa-apa dalam penjelajah penyelesaian tidak akan memindahkan atau mengatur fail dalam penjelajah fail OS anda. Cara yang selamat untuk mengatur fail anda di sisi penjelajah fail adalah membuang, tetapi tidak menghapus fail tertentu dari penjelajah penyelesaian, memindahkan fail yang sama dalam penjelajah fail ke lokasi yang diinginkan dan kemudian kembali ke penyelesai penyelesaian, klik kanan, cari pilihan "Tambah", kemudian cari "Item Yang Ada" dan cari fail yang anda pindahkan. Pastikan anda memindahkan fail header dan cpp.

Langkah 2: Tetapkan Pembina ke Peribadi

Tetapkan Pembina kepada Peribadi
Tetapkan Pembina kepada Peribadi

Dengan fail CPP dan header yang baru anda buat, jika tidak dibuka secara automatik semasa anda membuatnya, pergi ke penjelajah penyelesaian dan klik dan buka "EngineDebugSingleton.h". Anda kemudian akan disambut dengan "EngineDebugSingleton ()", pembina lalai kelas dan "~ EngineDebugSingleton ()" pemusnah kelas. Untuk langkah ini, kami ingin menetapkan konstruktor ke peribadi, ini bermaksud bahawa fungsi ini hanya tersedia untuk kelas dan tidak ada yang lain. Dengan ini, anda tidak akan dapat membuat pemboleh ubah atau mengalihkan kelas ke memori di luar kelas, hanya dalam fail tajuk kelas dan fungsi kelas yang lain. Mempunyai konstruktor peribadi adalah kunci kepada corak reka bentuk dan bagaimana orang-orang tunggal beroperasi. Kami akan mengetahui pada langkah-langkah mendatang bagaimana singleton dibuat dan diakses.

Kelas sekarang akan kelihatan seperti ini setelah memindahkan konstruktor ke peribadi (Lihat foto yang berkaitan)

Langkah 3: Tetapkan Destructor ke Private

Tetapkan Destructor ke Peribadi
Tetapkan Destructor ke Peribadi

Seperti yang kami lakukan dengan pembina di

langkah 2, untuk langkah ini, kita sekarang akan menetapkan pemusnah kepada peribadi. Seperti konstruktor, tidak ada, kecuali kelas itu sendiri, yang dapat menghapus sebarang pemboleh ubah kelas dari memori.

Kelas sekarang akan kelihatan seperti ini setelah menyelesaikan langkah ini. (Lihat foto Bersekutu)

Langkah 4: Membuat Pemboleh ubah Pointer Statik di Singleton

Membuat Pemboleh ubah Statik Pointer di Singleton
Membuat Pemboleh ubah Statik Pointer di Singleton

Dalam langkah ini, kita akan membuat a

pemboleh ubah statik jenis "EngineDebugSingleton *". Ini akan menjadi pemboleh ubah yang akan digunakan mengalokasikan singleton kita ke memori dan akan menunjukkannya sepanjang masa singleton kita diperuntukkan ke memori.

Seperti inilah rupa fail tajuk kami setelah membuat pemboleh ubah ini

Langkah 5: Membuat Fungsi Instance

Membuat Fungsi Instance
Membuat Fungsi Instance

Kami sekarang ingin membuat contoh

fungsi. Fungsi tersebut mestilah fungsi statik dan ingin mengembalikan rujukan ke kelas kami (“EngineDebugSingleton &”). Kami memanggil fungsi kami Instance (). Dalam fungsi itu sendiri, kita ingin menguji terlebih dahulu jika ptrInstance == nullptr (dapat dipendekkan menjadi! PtrInstance), jika nullptr, ini bermakna singleton belum diperuntukkan dan dalam ruang lingkup pernyataan if, kita akan ingin memperuntukkan dengan melakukan ptrInstance = EngineDebugSingleton baru (). Di sinilah anda sebenarnya memperuntukkan singleton ke memori. Setelah keluar dari ruang lingkup pernyataan if, kita kemudian akan mengembalikan apa yang ditunjukkan oleh ptrInstance, yang dilambangkan oleh sintaks "* ptrInstance". Kami akan menggunakan fungsi ini dengan banyak ketika membuat fungsi awam statik kami, jadi kami dapat memeriksa untuk mengetahui apakah singleton telah dibuat dan dialokasikan ke memori. Pada hakikatnya, fungsi ini menjadikannya anda hanya dapat satu peruntukan kelas dan tidak lebih.

Seperti inilah kelas kita sekarang setelah membuat fungsi Instance (). Seperti yang anda lihat, semua yang telah kami lakukan adalah tinggal di bahagian peribadi kelas, ini akan berubah sedikit dalam beberapa langkah berikutnya.

Langkah 6: Membuat Fungsi Awam Statik

Membuat Fungsi Awam Statik
Membuat Fungsi Awam Statik
Membuat Fungsi Awam Statik
Membuat Fungsi Awam Statik
Membuat Fungsi Awam Statik
Membuat Fungsi Awam Statik

Selepas anda membuat fungsi dari

langkah 5, anda boleh mula membuat fungsi awam statik. Setiap fungsi awam harus mempunyai fungsi peribadi untuk mengikutinya, nama fungsi ini tidak boleh sama. Mengapa membuat fungsi Statis? Kami menjadikan fungsi umum statis sehingga dapat diakses tanpa objek sebenarnya. Oleh itu, daripada melakukan sesuatu seperti "EngineDebugSingleObj-> SomeFunction ()", kita melakukan "EngineDebugSingleton:: Beberapa Fungsi ()". Ini memungkinkan untuk singleton diakses pada dasarnya di mana saja dalam kod, dengan syarat anda memasukkan # tajuk fail dalam fail projek tertentu yang sedang Anda kerjakan. Dengan ini, anda juga boleh membuat singleton melalui fungsi awamnya.

Untuk tujuan kami dalam langkah ini, kami membuat dua fungsi kekosongan statik awam, "tambah ()" dan "tolak ()". Di bahagian peribadi, kami mempunyai dua fungsi lagi, "PrivAdd ()" dan "PrivSubtract ()". Kami juga menambahkan pemboleh ubah int yang disebut "NumberOfThings". Definisi untuk fungsi ini akan masuk ke dalam fail CPP kelas kami. Untuk membuat fungsi masuk ke fail CPP dengan mudah, anda sorot, dengan kursor anda, fungsi, yang seharusnya mempunyai garis hijau di bawahnya, dan tekan "Left ALT + ENTER", ini akan memberi anda pilihan untuk membuat definisi di fail PKP berkaitan kelas. Lihat Foto 6.1 untuk melihat seperti apa fail tajuk dan setelah anda membuat semua definisi fungsi, CPP anda akan kelihatan seperti Foto 6.2 kecuali bahawa definisi fungsi anda tidak akan mempunyai kod di dalamnya.

Anda kini mahu menambahkan kod yang sama seperti pada Foto 6.2 ke dalam definisi fungsi anda. Seperti yang dinyatakan sebelumnya, fungsi umum kami akan menggunakan fungsi Instance (), yang akan mengembalikan apa yang ditunjukkan oleh ptrInstance. Ini membolehkan kita mengakses fungsi peribadi kelas kita. Dengan fungsi awam mana-mana orang, anda hanya perlu memanggil fungsi Instance itu. Satu-satunya pengecualian adalah fungsi Hentikan kami.

Catatan: Fungsi awam dan peribadi yang tepat yang ditunjukkan dalam langkah ini tidak diperlukan, anda boleh mempunyai nama fungsi dan operasi yang berbeza dalam fungsi peribadi, tetapi untuk sebarang jenis fungsi awam, anda harus mempunyai fungsi peribadi untuk mengikutinya dan fungsi awam harus selalu menggunakan, dalam kes kita, fungsi Instance ().

Langkah 7: Membuat Fungsi Tamatkan

Membuat Fungsi Tamatkan
Membuat Fungsi Tamatkan
Membuat Fungsi Tamatkan
Membuat Fungsi Tamatkan

Oleh kerana kita hanya boleh menyingkirkan singleton kita dari memori di kelas kita, kita mesti membuat fungsi awam yang statik. Fungsi ini akan memanggil delete pada ptrInstance, yang memanggil class destructor dan kemudian kami ingin menetapkan ptrInstance kembali ke nullptr sehingga dapat dialokasikan lagi jika program anda tidak berakhir. Anda juga ingin menamatkan Singleton anda untuk membersihkan memori yang diperuntukkan yang anda peruntukkan dalam mana-mana pemboleh ubah peribadi Singleton.

Langkah 8: Menetapkan PtrInstance ke Nullptr

Menetapkan PtrInstance ke Nullptr
Menetapkan PtrInstance ke Nullptr

Untuk melengkapkan singleton anda, anda ingin menuju ke fail EngineDebugSingleton. CPP dan di bahagian atas fail CPP, dalam contoh kami, ketik "EngineDebugSingleton * EngineDebugSingleton:: ptrInstance = nullptr."

Melakukan ini pada mulanya akan menetapkan ptrInstance ke nullptr, jadi apabila anda pertama kali menjalankan fungsi instance untuk pertama kalinya, kelas kami akan dibenarkan untuk dialihkan ke memori. Tanpanya, kemungkinan besar anda akan mendapat ralat kerana anda akan cuba mengakses memori yang tidak diperuntukkan kepadanya.

Langkah 9: Ujian dan Kesimpulan

Ujian dan Kesimpulan
Ujian dan Kesimpulan

Kami sekarang ingin menguji bahawa singleton kami untuk memastikannya berfungsi, ini akan melibatkan kita memanggil fungsi umum seperti yang dijelaskan dalam langkah 6 dan kami mengesyorkan agar anda menetapkan titik putus untuk meneliti kod anda dan melihat bahawa singleton berfungsi sebagai ia harus. Titik permulaan kami akan berada di main.cpp projek kami dan main.cpp kami sekarang seperti gambar di bawah.

Tahniah! Anda baru sahaja melengkapkan pelaksanaan Corak Reka Bentuk Singleton pertama anda. Dengan corak reka bentuk ini, anda kini dapat memperkemas kod anda dengan pelbagai cara. Sebagai contoh, anda sekarang boleh membuat sistem pengurus yang beroperasi sepanjang masa program anda, yang dapat diakses melalui fungsi statis di mana sahaja anda termasuk kelas.

Fail tajuk akhir anda akan kelihatan seperti foto 7.1. Fail CPP yang berkaitan dengan singleton anda akan kelihatan seperti Foto 6.2 dengan penambahan, di bahagian atas fail, kod yang ditunjukkan pada langkah 8. Arahan ini memberi anda struktur ringkas Corak Reka Bentuk Singleton.

Nasihat Penyelesaian Masalah:

Mendapatkan kesilapan berkaitan memori?

Pastikan anda merujuk ke langkah 7 dan langkah 8 untuk memastikan anda menetapkan ptrInstance ke nullptr.

Gelung tak terhingga berlaku?

Pastikan fungsi awam, dalam definisi mereka, anda memanggil fungsi peribadi, bukan fungsi umum yang sama.

Objek yang diperuntukkan dalam singleton menyebabkan kebocoran memori?

Pastikan anda memanggil fungsi penghentian singleton anda apabila sesuai dalam kod program anda, dan dalam pemusnah singleton anda, pastikan anda mengalihkan semua objek yang dialokasikan ke memori dalam ruang lingkup kod singleton.