面試題(Qt + 函數指標)

來源:互聯網
上載者:User

      面試官問的問題是:Qt訊號槽機制,你覺得可以用什麼策略來取代? 因為signal-slot本身是一個順序執行的過程,只有執行完slot之後,才會執行emit的下一條語句。其策略類似於函數調用,只不過由於其在QObject中架設了一個大的結構,這導致其執行效率不是很高,比直接的函數調用要慢10倍(忘記拿看的資料了)。平時在做項目時:如果可以我一般是用寫純虛介面的方式來替代signal-slot。   面試官又問:你有沒有想過用函數指標來替代? 汗一個先,以前真沒想過,而且函數指標用的也很少,今天專門補了一下這方面的知識,如下:

    

      一:關於函數指標。

      這個要區分於指標函數。

      ①:一個程式分為代碼區和資料區,那麼一個指標既可以指向在記憶體中存放資料的資料區,也可以指向存放代碼的代碼區。代碼區中存放的就是各個函數。由此可見:我們可以用一個指標來指向某個函數。

      ②:在c語言中規定:一個函數總是佔有一段連續的記憶體區,而函數名就是該函數所佔記憶體區的首地址。   我們可以將該函數所佔的這塊記憶體區的首地址賦給一個指標變數,使該指標變數指向這個函數!   而後我們就可以使用這個指標變數來找到和調用該函數。

         這種指向函數的指標變數就是“函數指標”

 

      函數指標的一般定義形式是:

      函數傳回值類型 (*函數指標名)(函數形參列表)

      例如:int (*pmax)(int,int); 這定義了一個指向含2個int形參,返回int值的函數指標。

 

     比如:函數 int max(int a,int b)

     我們可以這樣調: int as = max(a,b);  //這是用函數名調

     我們也可這樣調: int(*pmax)(int,int);//使用函數指標來調用

                            pmax = max;

                            int as = (*pmax)(a,b);

 

     注意事項:函數指標是指向函數的指標變數,它只能指向函數的入口處,而不能指向函數中間的某一條指令! 所以不能用*(pmax+1)這樣的方式來執行函數的下一條指令。

 

 

     二:signal-slot如何用函數指標來替代:

     知道函數指標是怎麼回事後,我們就可以來思考這個問題了。

     其本質還是如何使用函數指標來實現函數調用,那明擺著就是需要把函數指標都存放起來,而後當調用的時候直接去這個存放處尋找即可!我理解面試官的意思是這樣的:

     ①:原本在一個類中定義一些slot,我們可以如下替代他們:首先定義一些普通的成員函數(原本他們應該是slot),而後另外再建一個void函數指標數組:將原本用作slot的函數的函數指標全部存進來。  這樣:對於一個類而言:我們就是用一個函數指標數組來取代了slot。(同時用這個數組來區分一般的成員函數 和 類槽函數)。

     ②:對於connect()函數和signal,我沒想出什麼好辦法,貌似只能用observer介面。直接去調函數指標數組中的對應函數。

 

     我覺得關鍵在於:含有槽的類中:如果用函數指標來做的話,可以將原本的各個slot函數直接聲明為private成員函數,而將這個數組對外開放為public,這樣封裝一下的比較好,也能體現其區分優勢。

 

     如果大家有什麼好的idea,請告訴我。

    

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.