C++ 語言標准這些年進化的很快,許多新引入的特性我都沒有用過。說實話自己也比較懶,總是覺得自己對C++ 的掌握程度已經足夠應付日常的各種項目了,所以沒有學習新特性的動力。而且一直覺得新引入的特性多數都屬於那種“語法糖”,能夠發揮的作用不大,其實是可有可無的。
不過最近編寫一個小程序時代碼裡有個小bug,困擾了我好幾天。最後在幾個熱心網友的幫助下才解決了。這個小bug讓我認識到C++11 中提供的override 關鍵字非常有用,下面就簡單的說說我代碼中的那個小bug。
我的那個代碼是個利用Qt 寫的GUI程序,程序中需要響應鼠標的mouseMoveEvent 事件。但是結果怎麼也接收不到這個事件。下面是我的程序的一個簡化版本。
//MyWidget.h #ifndef MW_H #define MW_H #includeclass MyWidget : public QWidget { Q_OBJECT public: MyWidget(QWidget *parent = 0); ~MyWidget(); protected: void mousePressEvent( QMouseEvent * event ) ; void mouseReleaseEvent( QMouseEvent * event ) ; void mouseMoveEvent( QMoveEvent * event ) ; }; #endif
//MyWidget.cpp #include "MyWidget.h" #includeMyWidget::MyWidget(QWidget *parent):QWidget(parent) { } MyWidget::~MyWidget() { } void MyWidget::mousePressEvent( QMouseEvent * event ) { Q_UNUSED(event); qDebug() << "mousePressEvent"; } void MyWidget::mouseReleaseEvent( QMouseEvent * event ) { Q_UNUSED(event); qDebug() << "mouseReleaseEvent"; } void MyWidget::mouseMoveEvent( QMoveEvent * event ) { Q_UNUSED(event); qDebug() << "mouseMoveEvent"; }
//main.cpp #include#include "MyWidget.h" int main(int argc, char **argv) { QApplication app(argc, argv); MyWidget win; win.show(); return app.exec(); }
我甚至一度認為我用的這個Qt版本出了bug。後來換了好幾個Qt版本,甚至於到linux下還試了試,結果都是一樣的。折騰了好幾天,最後發現是我把函數原型寫錯了。本應是:
void mouseMoveEvent( QMouseEvent * event );
我錯寫為:
void mouseMoveEvent( QMoveEvent * event );<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+IDwvcD4KPHA+tvjH0rjVx8kgUXTW0NPQIFFNb3ZlRXZlbnQg1eK49sDgo6zL+dLU1eK49rT6wuux4NLryrHKssO0tO3O88zhyr62vMO709Cho9auy/nS1NXiwO+74dC0tO2jrMrH0vLOqlF01tDT0MHtzeLSu7j2ysK8/qOs1K3QzcrHo7o8L3A+CjxwPnZvaWQgbW92ZUV2ZW50KCBRTW92ZUV2ZW50ICogZXZlbnQgKTs8L3A+CjxwPiA8L3A+CjxwPtfuv6rKvM7StO29q9XiuPbKwrz+tbGzycrzserSxravysK8/sHLo6y688C0t6LP1ru509C49m1vdXNlTW92ZUV2ZW50vs3L5srWvau6r8r9w/u4xLn9wLTBy6OstavKx8O716LS4rrzw+a1xLLOyv3A4NDNyseyu82stcSjrL3hufu+zbGvvufBy6GjPC9wPgo8cD4gPC9wPgo8cD7I57n7yrnTw8HLIG92ZXJyaWRlILnYvPzX1qOs1eLW1rTtzvPKx7rcyN3S17Hcw+K1xKGjPC9wPgo8cHJlIGNsYXNzPQ=="brush:java;">//MyWidget.h
#ifndef MW_H
#define MW_H
#include 再次編譯,就會提示 ‘void MyWidget::mouseMoveEvent( QMoveEvent * event )’marked override, but does not override 不過override 關鍵字需要編譯器支持 C++11。如果使用的是 gcc 編譯器,需要加入命令行參數 -std=c++11