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