Почему в приведенном случае указатель this используется явно
В процессе повторения основ C++ возникли трудности с указателями. В статье по разработке игры приведен следующий код:
отрывок из game.hpp, объявлена функция pushState, которая принимает параметр
class Game {
public:
std::stack<GameState*> states;
void pushState(GameState* state);
void popState();
};
Далее определение функции в game.cpp:
void Game::pushState(GameState* state)
{
this->states.push(state);
return;
}
void Game::popState()
{
delete this->states.top();
states.pop();
return;
}
Для чего в приведенном случае явно использован указатель this? Почему нельзя определить так:
void Game::pushState(GameState* state)
{
states.push(state);
return;
}
void Game::popState()
{
delete states.top();
states.pop();
return;
}
Буду благодарна за помощь в понимании.
Ответы (1 шт):
Во-первых, так:
void Game::pushState(GameState* state)
{
states.push(state);
return;
}
void Game::popState()
{
delete states.top();
states.pop();
return;
}
Определить можно. В данном случае. Как с явным использованием this, так и без него - дело вкуса (или каких-то особых мотивов, связанных с предпочтениями о кодировании - на эту тему программисты, порой, ведут "священные войны"). Автор, возможно, имел в виду то, что это именно поля, а не "просто какие-то переменные". А возможно откуда-то передрал код.
Есть случай, где явное использование this действительно одно из возможных решений реальной проблемы, а не дело вкуса (пример условный, главное, чтобы была ясна суть):
class C {
public:
void set_var(int var) {
this->var = var;
}
private:
int var;
};
В таком варианте, явное использование this говорит компилятору, что слева - var - поле класса, а справа - аргумент метода, т.е. они оба называются "var", но это разные переменные.
Другое решение такой проблемы - добавить префиксы/суффиксы к переменным-полям класса/структуры. Наиболее типичные, это префиксы "m_" и "m", либо суффикс "_" (нижнее подчёркивание). Выглядело бы сие так:
class C {
public:
void set_var(int var) {
var_ = var;
}
private:
int var_;
};
Т.е. тут у компилятора не будет неоднозначности в определении переменных: слева var_ - поле, справа var - аргумент функции (с другими префиксами могло бы называться иначе, вроде mvar, mVar, m_var или m_Var - в зависимости от соглашения о наименовании - snake case/camel case/pascal case/.../your cool own style case - как кому удобнее).
При том, что класс C - я только что выдумал, саму проблему, решаемую (в других случаях) особым именованием полей/явным использованием this, я проиллюстрировал: и то, и другое, может служить устранению неоднозначности при схожих названиях переменных-полей и переменных-аргументов вызова методов.