在 `qt5video.cpp` 中定義成員函數 `IplImage* FindCountours(IplImage* src, IplImage* pContourImg)` 時,嘗試在類內使用 `ui.textEdit->insertPlainText(...)` 操作 UI 控件,編譯器報錯“無法識別 ui”,或提示函數定義與聲明不匹配。
C++ 類成員函數在類外定義時,**必須加上類名和作用域解析符 `類名::`**,否則編譯器將其視為普通全局函數,導致無法訪問類的私有成員(如 `ui` 指針)。
class QT5video : public QWidget {
Q_OBJECT
public:
explicit QT5video(QWidget *parent = 0);
// 正確聲明:返回類型 函數名(參數列表)
IplImage* FindCountours(IplImage* src, IplImage* pContourImg);
private:
Ui::QT5video *ui;
};
// 正確定義:返回類型 類名::函數名(參數列表) { 函數體 }
IplImage* QT5video::FindCountours(IplImage* src, IplImage* pContourImg) {
// 此處可正常訪問 ui 成員
ui->textEdit->insertPlainText("333333");
ui->label->setText("Yes");
// OpenCV 圖像處理邏輯...
return processedImage;
}
| 錯誤寫法 | 問題 |
|---|---|
| `IplImage* FindCountours(...)` | 缺少 `QT5video::`,被視為全局函數,無 `this` 指針 |
| `IplImage* QT5video::FindCountours(IplImage src, ...)` | 參數類型不匹配(缺少指針 `*`),導致重載解析失敗 |
**成員函數類外定義鐵律**:`返回類型 類名::函數名(參數列表) { ... }`。加上類名後,函數體內即可直接使用 `ui`、`this` 及所有類成員。