2016-07-25 118 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#并没有什么不同,只是范围分隔符是'.'而不是'::'。我错了吗? –