串口中我要把奇偶校驗等enum數據對應寫到一個ComboBox中去,所以需要在我的Settings類中加入一個函數用來轉換。
這里,我首先在settings.h的class Settings中加上對該函數的聲明
1 class Settings : public QDialog 2 { 3 Q_OBJECT 4 5 public: 6 explicit Settings(QWidget *parent = 0); 7 ~Settings(); 8 QString &stopbit2string(enum QSerialPort::StopBits stop); 9 QString &parity2string(enum QSerialPort::Parity parity); 10 11 private slots: 12 void on_buttonBox_accepted();
然后在settings.cpp加上這兩個函數的實現,殼
1 QString &stopbit2string(enum QSerialPort::StopBits stop) 2 { 3 QString *ret = new QString("Eitd1"); 4 return *ret; 5 } 6 7 QString &parity2string(enum QSerialPort::Parity parity) 8 { 9 QString *ret = new QString("Eitd2"); 10 return *ret; 11 }
這樣編譯就出錯:
error LNK2019: 無法解析的外部符號 "public: class QString __cdecl Settings::parity2string(enum QSerialPort::Parity)"
這回就困惑了,由於我想到QT的編譯依賴做得並不是很好,比如.pro文件可能不會隨着工程文件的修改而變化,所以我檢查了一下該文件,又把工程目錄下的debug、release、makefile等都刪除了,再清除了工程再重新構建,也還是出同樣的錯誤。
在鏈接的時候無法解析外部符號,情況多數是這些情況:
1. 符號沒有定義而被調用了
2. 符號在某個文件中被定義了,但是當前文件不知道,因為沒有聲明;
據此為出發點,我再去查找了一下C++對類方法的定義與調用的問題。
結果是有收獲的,問題是我沒有對Settings::parity2string定義,因為我的代碼是用以下代碼來定義的
1 QString &parity2string(enum QSerialPort::Parity parity)
其實是我疏忽了,寫C語言的我,忘記了C++的方法實現需要在前面加上類名,只要把這兩個函數改成以下樣子就可以了:
1 QString & Settings::stopbit2string(enum QSerialPort::StopBits stop) 2 { 3 QString *ret = new QString("Eitd1"); 4 return *ret; 5 } 6 7 QString & Settings::parity2string(enum QSerialPort::Parity parity) 8 { 9 QString *ret = new QString("Eitd2"); 10 return *ret; 11 }