GDB не показывает » это » при входе в статический метод синглтона?

У меня следующая ситуация. Это урезанная версия класса. Я запускаю его в Qt creator и использую Qt в реальном сценарии.

class MyClass
{
public:
MyClass();
static MyClass *instance;
static void myMethod(int a, int b);
int name;
};

MyClass  *MyClass::instance = 0;

MyClass::MyClass(){
if (instance)
exit(-1);
instance = this;
}

void MyClass::myMethod(int a, int b){
if(instance->name == a) qDebug() << "hello";
}

int main(int argc, char *argv[])
{
MyClass cls;
cls.myMethod(1,2);
}

Я пытаюсь отладить myMethod войдя в него с помощью отладчика. Когда я вхожу в метод, только a 1 а также b 2 видны в часах и нет ссылки на this или же instance,

Обновить
В ответах говорилось, что статические методы не привязаны к объекту, поэтому нет this имеется в наличии.

В этой реализации статический метод обращается к instance и это то, что я хотел бы иметь в отладчике, как только я вступлю в myMethod,

Как бы я сделал это доступным / видимым?

0

Решение

Статические методы фактически вызываются без объекта. Вызов

MyClass cls;
cls.myMethod(1,2)

эквивалентно

MyClass::myMethod(1, 1)

Как следствие myMethod не получает никаких this значение.

6

Другие решения

Такое поведение следует ожидать, так как статический метод не имеет доступа к this, поскольку это не связано с объектом.

Простое решение от этот ответ :

Вы не можете получить доступ к нестатическому члену внутри статического метода, если явно не сделаете доступным экземпляр объекта внутри функции-члена (явно передайте экземпляр объекта в качестве аргумента или используйте глобальный экземпляр, к которому можно получить доступ внутри функции)

Это значит изменить метод на это:

static void myMethod(MyClass instance, int a, int b);
3

Причина в том, что статические методы не действуют ни на один объект, и нет this, На самом деле, довольно необычно вызывать статическую функцию для объекта. Это сделало бы то же самое и является более обычным способом вызова сатирических функций:

int main(int argc, char *argv[])
{
MyClass cls;
MyClass::myMethod(1,2); //look Ma, no object!
}

При этом становится очевидным, что объект cls вообще не нужен в вашем примере кода, поэтому вы можете полностью его исключить. То же относится и к аргументам main, так как вы не используете их.

3
По вопросам рекламы [email protected]