Цей макрос може бути визначений у деякому глобальному заголовку або, краще, як параметр командного рядка компілятора:
#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" - Коли ви видаляєте або перейменовуєте якогось члена, компілятор надійно повідомляє вас у місцях, де цей член використовується. (Деякі глобальні функції можуть мати одне ім’я та існувати ймовірність, що ви можете ввести помилку, якщо ви не використовуєте явне це).
- Коли ви рефакторинг коду і робить не члена члена функції від члена (щоб зробити кращу інкапсуляцію) явним, це показує вам місце, яке ви повинні відредагувати, і ви можете легко замінити це покажчиком на екземпляр класу, який задається як параметр функції не члена
- Як правило, коли ви змінюєте код, є більше шансів на помилки, коли ви не використовуєте явне це, ніж коли ви явно це використовуєте скрізь.
- Відверто, це менш шумно, ніж явне „m_“, коли ви вступаєте до складу (
object.memberзobject.m_member) (завдяки @Kaz, що помітив цю точку) - Явне це вирішує універсальну проблему для всіх членів - атрибути та методи, тоді як „m_“ або інший префікс практично можна використовувати лише для атрибутів.
Я хотів би відполірувати і розширити цей список, скажіть, якщо ви знаєте про інші переваги та використовуєте випадки для явного цього скрізь .
#define self (*this)? Ви навіть можете змішати обидва макроси та мати деякі файли, що імітують VB та інші Python. :)
me_x.