2014-02-14 16 views
0

我有以下情況。這是該課程的精簡版。我在Qt創建者中運行它,並在真實場景中使用Qt。當單步進入單身的靜態方法時,gdb沒有顯示「this」?

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 1b 2可見,並且沒有提及thisinstance

更新 的回答說,靜態方法不綁定到這就是爲什麼沒有this可用的對象。

在這個實現中,靜態方法訪問instance,這就是我一旦進入myMethod就想在調試器中可用的東西。

我該如何讓這些可用/可見?

+0

你的編輯沒有任何意義,因爲我確實在debuger中看到了'intance'。看到這一點,很容易看到'instance-> name' –

+0

@BЈовић我錯過了代碼示例中的本質,我道歉。這是一個可重複的更新,其中'instance'不可訪問。 – TheMeaningfulEngineer

+2

*靜態方法訪問實例,這就是我希望在調試器中可用的一次進入myMethod *在MyClass :: instance上設置監視器? –

回答

6

靜態方法實際上被稱爲沒有對象。呼叫

MyClass cls; 
cls.myMethod(1,2) 

相當於

MyClass::myMethod(1, 1) 

作爲myMethod未接收到任何this值的結果。

3

原因是靜態方法不會對任何對象起作用,也不存在this。實際上,在對象上調用靜態函數是非常不尋常的。這將做同樣的,是更常見的方法來調用satic功能:

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

有了這個可以很明顯看出不需要CLS對象都在您的示例代碼,所以你可以離開它完全。這同樣適用於main的參數,因爲您不使用它們。

3

這樣的行爲是可以預料的,因爲靜態方法無法訪問this,因爲它沒有綁定到對象。

this answer簡單的解決方案:

不能靜態方法,除非你明確地使成員函數內部可用的對象實例內部訪問非靜態成員(通過對象實例明確作爲參數,或者使用一個全球性的。例如它可以在函數內部訪問)

這意味着改變方法到此:

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

更新了問題。由於'myMethod'成功訪問'instance'而沒有作爲參數,我想知道是否有可能在不改變代碼的情況下在調試器中獲得它(添加'MyClass instance'作爲參數)。 – TheMeaningfulEngineer