Saya menggunakan C dan struct
s di mana sebuah struct dapat memiliki anggota tetapi tidak berfungsi. Asumsikan untuk kesederhanaan bahwa saya ingin membuat struct untuk string yang saya beri nama str
dan saya ingin dapat melakukan di str.replace(int i, char c)
mana i
indeks string dan c
karakter untuk menggantikan karakter di posisi i
. Apakah ini tidak pernah mungkin karena struct tidak dapat memiliki fungsi atau masih ada beberapa cara kita dapat menerapkan perilaku ini dan meniru bahwa struct dapat memiliki fungsi (sederhana) yang sebenarnya hanya struct menyalin sendiri ke struct baru dan memperbarui nya bidang, yang bisa dilakukan?
Jadi replace
bisa menjadi anggota ketiga dari struct yang menunjuk ke sebuah struct baru yang diperbarui ketika diakses atau serupa. Bisakah itu dilakukan? Atau adakah sesuatu yang dibangun di dalam teori atau paradigma yang menghalangi niat saya?
Latar belakangnya adalah saya sedang menulis kode C dan saya menemukan kembali fungsi-fungsi yang saya tahu adalah library builtin dalam bahasa OOP dan bahwa OOP akan menjadi cara yang baik untuk memanipulasi string dan perintah.
sumber
str.replace(&str, i, c)
itu. C ++ mengotomatiskan lewat darithis
pointer, tentu saja.Jawaban:
Fungsi Anda akan terlihat seperti ini.
Ini menerima pointer ke objek untuk beroperasi sebagai parameter pertama. Dalam C ++, ini dikenal sebagai
this
-pointer dan tidak perlu dideklarasikan secara eksplisit. (Bandingkan ini dengan Python di mana harus.)Untuk memanggil fungsi Anda, Anda juga akan melewatkan pointer itu secara eksplisit. Pada dasarnya, Anda menukar
o.f(…)
sintaksis denganf(&o, …)
sintaksis. Bukan masalah besar.Cerita menjadi lebih terlibat jika Anda ingin mendukung polimorfisme (
virtual
fungsi alias ). Itu juga dapat ditiru dalam C (saya sudah menunjukkannya untuk jawaban ini .) Tetapi tidak cukup untuk dilakukan dengan tangan.Seperti yang dikomentari Jan Hudec , Anda juga sebaiknya membiasakan awalan nama fungsi dengan nama tipe (yaitu
string_replace
) karena C tidak memiliki spasi-nama sehingga hanya ada satu fungsi yang dinamaireplace
.sumber
string_replace
, karena C juga tidak memiliki fungsi yang berlebihan dan Anda mungkin memiliki beberapa lainnyareplace
untuk beberapa jenis lainnya ...string_replace
. Nama yang dimulai denganstr
,,mem
atauwcs
diikuti dengan huruf kecil dicadangkan untuk ekstensi di masa mendatang.Structs dapat menampung fungsi pointer , tetapi itu benar-benar hanya diperlukan untuk metode virtual. Metode non-virtual dalam berorientasi objek C biasanya dilakukan dengan melewatkan struct sebagai argumen pertama ke fungsi biasa. Lihatlah Gobject untuk contoh yang baik dari kerangka kerja OOP untuk C. Ini menggunakan makro untuk menangani banyak pelat ketel yang diperlukan untuk pewarisan dan polimorfisme.
C diciptakan 44 tahun yang lalu. Ini adalah bahasa yang sangat populer untuk open source. Anda bukan orang pertama yang berpikir string C standar tidak pas untuk digunakan. Lakukan beberapa pencarian untuk perpustakaan string C. Anda tidak perlu menemukan kembali roda.
sumber
Dengan pointer fungsi, Anda dapat melakukan:
Ini umumnya hanya berguna jika implementasi dapat berubah, dalam hal ini Anda harus menggunakan vtable sehingga overhead hanya satu pointer per struct:
sumber
str
(ataumem
atauwcs
) dan huruf kecil dicadangkan oleh standar C untuk ekstensi di masa mendatang, jadi jangan menyebutnyastring_replace
.str_replace
baik-baik saja.Ya, mereka bisa, semacam. Anda dapat menggunakan fakta bahwa C memungkinkan pointer berfungsi blok di memori, alias fungsi pointer dan menggunakan bahwa Anda dapat membuat antarmuka seperti polimorfisme serta fungsi virtual (bahkan jika tidak begitu cantik).
Saya menulis posting blog tentang hal ini, mengikuti pertanyaan dari salah satu siswa saya, baru-baru ini, yang berkaitan dengan kode seperti antarmuka dalam C dan Go, Anda dapat membacanya di sini:
Posting blog pada antarmuka non-OO
Lihat apakah itu memberi Anda ide.
Anda juga bisa memasukkan fungsi bebas ke dalam kode Anda, dan menggunakan penunjuk "this", yang berarti Anda meneruskan sebuah pointer ke struct yang sudah ada untuk dikerjakan, seperti dijelaskan dalam jawaban lain.
sumber