Macro này có thể được định nghĩa trong một số tiêu đề toàn cầu, hoặc tốt hơn, như là một tham số dòng lệnh của trình biên dịch:
#define me (*this)
Và một số ví dụ sử dụng:
some_header.h:
inline void Update()
{
/* ... */
}
chính.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;
};
Vì vậy, trong một phương thức lớp khi tôi truy cập một thành viên lớp, tôi luôn sử dụng me
và khi truy cập một định danh toàn cầu tôi luôn sử dụng ::
. Điều này cung cấp cho người đọc không quen thuộc với mã (có thể là bản thân tôi sau một vài tháng) thông tin địa phương về những gì được truy cập mà không cần phải tìm ở nơi nào khác. Tôi muốn xác định me
bởi vì tôi thấy việc sử dụng this->
ở mọi nơi quá ồn ào và xấu xí. Nhưng có thể #define me (*this)
được coi là một thực hành C ++ tốt? Có một số điểm có vấn đề thực tế với me
vĩ mô? Và nếu bạn là lập trình viên C ++ sẽ là người đọc một số mã sử dụng me
macro, bạn có muốn hay không?
Chỉnh sửa: Bởi vì nhiều người tranh luận không sử dụng contraicaly contra me
, nhưng contra contra rõ ràng điều này. Tôi nghĩ có thể không rõ lợi ích của "rõ ràng ở mọi nơi" là gì.
Lợi ích của "rõ ràng này ở khắp mọi nơi" là gì?
- Là một người đọc mã, bạn chắc chắn những gì được truy cập và bạn có thể tập trung vào những thứ khác nhau hơn là xác minh - trong một số mã ở xa - đó thực sự được truy cập những gì bạn nghĩ là được truy cập.
- Bạn có thể sử dụng chức năng tìm kiếm cụ thể hơn. Tìm kiếm "
this->x
" có thể cung cấp cho bạn nhiều kết quả mong muốn hơn là chỉ tìm kiếm "x
" - Khi bạn đang xóa hoặc đổi tên một số thành viên, trình biên dịch đáng tin cậy sẽ thông báo cho bạn tại những nơi mà thành viên này được sử dụng. (Một số chức năng toàn cầu có thể có cùng tên và tồn tại cơ hội bạn có thể đưa ra lỗi nếu bạn không sử dụng rõ ràng điều này).
- Khi bạn tái cấu trúc mã và tạo hàm không phải thành viên từ thành viên (để đóng gói tốt hơn), điều này cho thấy bạn phải chỉnh sửa và bạn có thể dễ dàng thay thế nó bằng con trỏ đến thể hiện của lớp được đưa ra dưới dạng tham số hàm không phải thành viên
- Nói chung khi bạn đang thay đổi mã, sẽ có nhiều lỗi hơn khi bạn không sử dụng điều này rõ ràng hơn là khi bạn đang sử dụng điều này rõ ràng ở mọi nơi.
- Rõ ràng điều này ít ồn ào hơn explicit m_ Rõ khi bạn đang tham gia thành viên từ bên ngoài (
object.member
vsobject.m_member
) (nhờ @Kaz để phát hiện điểm này) - Giải thích điều này giải quyết phổ quát vấn đề cho tất cả các thành viên - thuộc tính và phương thức, trong khi „m_ xông hoặc tiền tố khác chỉ có thể sử dụng được cho các thuộc tính.
Tôi muốn đánh bóng và mở rộng danh sách này, cho tôi biết nếu bạn biết về những lợi thế khác và sử dụng các trường hợp để giải thích điều này ở mọi nơi .
#define self (*this)
? Bạn thậm chí có thể trộn cả hai macro và có một số tệp bắt chước VB và các Python khác. :)
me_x
.