У меня следующая ситуация. Это урезанная версия класса. Я запускаю его в 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
,
Как бы я сделал это доступным / видимым?
Статические методы фактически вызываются без объекта. Вызов
MyClass cls;
cls.myMethod(1,2)
эквивалентно
MyClass::myMethod(1, 1)
Как следствие myMethod
не получает никаких this
значение.
Такое поведение следует ожидать, так как статический метод не имеет доступа к this
, поскольку это не связано с объектом.
Простое решение от этот ответ :
Вы не можете получить доступ к нестатическому члену внутри статического метода, если явно не сделаете доступным экземпляр объекта внутри функции-члена (явно передайте экземпляр объекта в качестве аргумента или используйте глобальный экземпляр, к которому можно получить доступ внутри функции)
Это значит изменить метод на это:
static void myMethod(MyClass instance, int a, int b);
Причина в том, что статические методы не действуют ни на один объект, и нет this
, На самом деле, довольно необычно вызывать статическую функцию для объекта. Это сделало бы то же самое и является более обычным способом вызова сатирических функций:
int main(int argc, char *argv[])
{
MyClass cls;
MyClass::myMethod(1,2); //look Ma, no object!
}
При этом становится очевидным, что объект cls вообще не нужен в вашем примере кода, поэтому вы можете полностью его исключить. То же относится и к аргументам main
, так как вы не используете их.