2016-07-25 115 views
0

首先,我不熟悉C++/Qt,所以我試了一下,因爲我會在C#做...我也有一些問題與指針..「未定義引用」-error /靜態成員變種在C + +/Qt

故事:我使用QSerialPort讀取和寫入串行232端口。當然,應該只有一個實例,否則會出現訪問錯誤。所以我的想法是定義一個靜態成員變量來保存對象。

問題:我總是得到錯誤 「未定義參考SerialManager::obj

的源代碼:

serialmanager.h

#include <QSerialPort> 
class SerialManager 
{ 
public: 
    static QSerialPort* getObj(); 
private: 
    static QSerialPort* obj; 
} 

serialmanager.cpp

#include "serialmanager.h" 
QSerialPort *obj = new QSerialPort(); 

QSerialPort* SerialManager::getObj() 
{ 
    if(!obj->isOpen()) 
    { 
     obj->setPortName("/dev/ttyO1"); //error line 
     obj->setBaudRate(QSerialPort::Baud57600); 
     //and so on... 
    } 
    return obj; 
} 
+0

您的答案如下。順便說一句,如果你只需要一個實例,你可以創建一個實例,並擺脫靜態變量 – wasthishelpful

回答

2

在頭文件,你在頭文件中聲明SerialManager::obj

在您的實現文件中,您正在定義obj而不是SerialManager::obj

的修復方法就是改變

QSerialPort *obj = new QSerialPort(); 

QSerialPort *SerialManager::obj = new QSerialPort(); 

您可能會發現你想把它初始化到nullptr,構建按需當你需要它(這可能解決依賴問題,和/或改進程序開始時間,如果你有許多靜態對象要構造的話)。

如果你真的想永遠只構造一個對象,你也可以使指針(而不是指向的對象)常數:

private: 
    static QSerialPort *const obj; 

,可以防範意外再次分配(但可以難以用單元測試替換不同的對象)。

+0

也謝謝!也因爲有了nullptr的建議 – Cheesi

1

你缺少類名,解決它通過改變

QSerialPort *obj = new QSerialPort(); 

QSerialPort *SerialManager::obj = new QSerialPort(); 
+0

謝謝! C++真的不是我的世界...... – Cheesi

+0

但就這一點而言,C#並沒有什麼不同,只是範圍分隔符是'.'而不是'::'。我錯了嗎? –