Makro ini dapat didefinisikan dalam beberapa tajuk global, atau lebih baik, sebagai parameter baris perintah kompiler:
#define me (*this)
Dan beberapa contoh penggunaan:
some_header.h:
inline void Update()
{
/* ... */
}
main.cpp:
#include "some_header.h"
class A {
public:
void SetX(int x)
{
me.x = x;
me.Update();
}
void SomeOtherFunction()
{
::Update();
}
/*
100 or more lines
...
*/
void Update()
{
// ...
}
int x;
};
Jadi dalam metode kelas ketika saya mengakses anggota kelas, saya selalu menggunakan me
, dan ketika mengakses pengenal global saya selalu menggunakan ::
. Ini memberikan pembaca yang tidak terbiasa dengan kode (mungkin saya sendiri setelah beberapa bulan) informasi lokal dari apa yang diakses tanpa perlu mencari di tempat lain. Saya ingin mendefinisikan me
karena saya menemukan menggunakan di this->
mana - mana terlalu berisik dan jelek. Tapi bisakah #define me (*this)
dianggap praktik C ++ yang bagus? Apakah ada beberapa poin masalah praktis dengan me
makro? Dan jika Anda sebagai programmer C ++ akan menjadi pembaca beberapa kode menggunakan me
makro, apakah Anda suka atau tidak?
Sunting: Karena banyak orang berargumen tidak menggunakan kontra secara spesifik me
, tetapi pada umumnya menentang ini secara eksplisit. Saya pikir mungkin tidak jelas apa manfaat dari "eksplisit ini di mana-mana".
Apa manfaat dari "eksplisit ini di mana-mana"?
- Sebagai pembaca kode Anda memiliki kepastian apa yang diakses dan Anda dapat berkonsentrasi pada hal-hal yang berbeda daripada memverifikasi - dalam beberapa kode yang jauh - yang benar-benar diakses apa yang Anda pikir diakses.
- Anda dapat menggunakan fungsi pencarian secara lebih spesifik. Pencarian "
this->x
" dapat memberi Anda lebih banyak hasil yang diinginkan daripada hanya pencarian "x
" - Ketika Anda menghapus atau mengganti nama beberapa anggota, kompiler dengan andal memberi tahu Anda di tempat-tempat di mana anggota ini digunakan. (Beberapa fungsi global dapat memiliki nama yang sama dan ada kemungkinan Anda dapat memperkenalkan kesalahan jika Anda tidak menggunakan ini secara eksplisit).
- Ketika Anda refactoring kode dan membuat fungsi non-anggota dari anggota (untuk membuat enkapsulasi yang lebih baik) secara eksplisit ini menunjukkan kepada Anda tempat yang harus Anda edit dan Anda dapat dengan mudah mengganti ini dengan pointer ke instance kelas yang diberikan sebagai parameter fungsi non-anggota
- Umumnya ketika Anda mengubah kode, ada lebih banyak kemungkinan kesalahan ketika Anda tidak menggunakan eksplisit ini daripada ketika Anda menggunakan eksplisit ini di mana-mana.
- Secara eksplisit ini kurang berisik daripada eksplisit „m_“ ketika Anda mengakses anggota dari luar (
object.member
vsobject.m_member
) (terima kasih kepada @Kaz untuk menemukan titik ini) - Secara eksplisit ini memecahkan masalah secara universal untuk semua anggota - atribut dan metode, sedangkan „m_“ atau awalan lainnya secara praktis hanya dapat digunakan untuk atribut.
Saya ingin memoles dan memperpanjang daftar ini, beri tahu saya jika Anda tahu tentang kelebihan lain dan gunakan case untuk ini secara eksplisit di mana-mana .
#define self (*this)
? Anda bahkan dapat mencampur kedua makro dan memiliki beberapa file yang meniru VB dan yang lainnya Python. :)
me_x
.