แมโครนี้สามารถกำหนดในส่วนหัวร่วมบางส่วนหรือดีกว่าเป็นพารามิเตอร์บรรทัดคำสั่งคอมไพเลอร์:
#define me (*this)
และตัวอย่างการใช้งาน:
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;
};
ดังนั้นในวิธีการเรียนเมื่อฉันเข้าถึงสมาชิกชั้นเรียนผมมักจะใช้และเมื่อมีการเข้าถึงตัวระบุทั่วโลกผมใช้เสมอme
::
สิ่งนี้จะช่วยให้ผู้อ่านที่ไม่คุ้นเคยกับรหัส (อาจเป็นตัวฉันเองหลังจากผ่านไปไม่กี่เดือน) ข้อมูลที่แปลเป็นภาษาท้องถิ่นของสิ่งที่เข้าถึงได้โดยไม่จำเป็นต้องดูที่อื่น ฉันต้องการกำหนดme
เพราะฉันพบว่าการใช้this->
ทุกที่ที่มีเสียงดังและน่าเกลียดเกินไป แต่#define me (*this)
ถือได้ว่าเป็นการฝึกภาษา C ++ ที่ดี? มีบางประเด็นที่เป็นประโยชน์กับme
แมโครหรือไม่ และถ้าคุณเป็นโปรแกรมเมอร์ C ++ จะเป็นผู้อ่านโค้ดบางตัวโดยใช้me
มาโครคุณจะชอบหรือไม่?
แก้ไข:เนื่องจากมีคนจำนวนมากที่ไม่โต้แย้งการใช้ในทางตรงกันข้ามme
แต่ในทางตรงกันข้ามมันชัดเจน ฉันคิดว่ามันอาจจะไม่ชัดเจนว่าสิ่งที่เป็นประโยชน์ของ "ชัดเจนนี้ทุกที่"
อะไรคือประโยชน์ของ "ชัดเจนทุกที่"?
- ในฐานะผู้อ่านรหัสคุณมีความมั่นใจว่ามีการเข้าถึงอะไรบ้างและคุณสามารถจดจ่อกับสิ่งต่าง ๆ ได้มากกว่าการตรวจสอบยืนยันในรหัสที่อยู่ไกลออกไปซึ่งเข้าถึงได้จริง ๆ ในสิ่งที่คุณคิดว่าเข้าถึงได้
- คุณสามารถใช้ฟังก์ชั่นการค้นหาได้มากขึ้นโดยเฉพาะ การค้นหา "
this->x
" สามารถให้ผลลัพธ์ที่คุณต้องการมากกว่าการค้นหา "x
" เท่านั้น - เมื่อคุณลบหรือเปลี่ยนชื่อสมาชิกคอมไพเลอร์จะแจ้งเตือนคุณในที่ที่สมาชิกนี้ใช้งานอยู่ (ฟังก์ชั่นทั่วโลกบางอย่างสามารถมีชื่อเดียวกันและมีโอกาสที่คุณสามารถแนะนำข้อผิดพลาดหากคุณไม่ได้ใช้สิ่งนี้อย่างชัดเจน)
- เมื่อคุณกำลัง refactoring รหัสและทำให้ฟังก์ชั่นที่ไม่ใช่สมาชิกจากสมาชิก (เพื่อให้ encapsulation ดีขึ้น) ชัดเจนนี้แสดงสถานที่ที่คุณต้องแก้ไขและคุณสามารถแทนที่ได้อย่างง่ายดายด้วยตัวชี้ไปยังอินสแตนซ์ของคลาสที่กำหนดให้เป็นพารามิเตอร์ฟังก์ชั่นที่ไม่ใช่สมาชิก
- โดยทั่วไปเมื่อคุณเปลี่ยนรหัสมีความเป็นไปได้มากกว่าที่จะเกิดข้อผิดพลาดเมื่อคุณไม่ได้ใช้สิ่งนี้อย่างชัดเจนมากกว่าเมื่อคุณใช้รหัสนี้อย่างชัดเจนทุกที่
- เสียงนี้ชัดเจนน้อยกว่าเสียงรบกวนอย่างชัดเจน„ m_“ เมื่อคุณเป็นสมาชิกจากภายนอก (
object.member
vsobject.m_member
) (ขอบคุณ @Kaz ที่จะตรวจสอบจุดนี้) - วิธีนี้จะช่วยแก้ปัญหาที่ชัดเจนสำหรับสมาชิกทุกคน - คุณลักษณะและวิธีการในขณะที่„ m_“ หรือคำนำหน้าอื่น ๆ นั้นสามารถนำไปใช้งานได้จริงสำหรับคุณลักษณะเท่านั้น
ผมอยากจะขัดและขยายรายการนี้บอกฉันว่าคุณรู้เกี่ยวกับผลประโยชน์อื่น ๆ และกรณีการใช้งานสำหรับการอย่างชัดเจนนี้ในทุกที่
#define self (*this)
ล่ะ? คุณสามารถผสมทั้งสองมาโครและมีบางไฟล์ที่เลียนแบบ VB และ Python อื่น ๆ :)
#include "vb.h"
, #Include pascal.h
หรือ#include FOTRAN.h
มีคนต่อไปที่จะสัมผัสรหัสของคุณส่งไปยังTDWTF
me_x
ต่างๆดังนี้