Почему в приведенном случае указатель 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 шт):

Автор решения: VladimirS

Во-первых, так:

   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, я проиллюстрировал: и то, и другое, может служить устранению неоднозначности при схожих названиях переменных-полей и переменных-аргументов вызова методов.

→ Ссылка