“对C ++ / Qt中的-error / static成员var的未定义引用

时间:2016-07-25 15:03:51

标签: c++ qt

首先,我对C++/Qt并不熟悉,所以我尝试了,因为我会在C#中这样做...我也有一些指针问题..

故事:我使用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;
}

2 个答案:

答案 0 :(得分:2)

在头文件中,您在头文件中声明SerialManager::obj

在您的实施文件中,您要定义obj,而不是SerialManager::obj

修复方法是改变

QSerialPort *obj = new QSerialPort();

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

您可能会发现要将其初始化为nullptr,并在需要时按需构建(可能会解决依赖项问题,和/或改善程序启动时间,如果要构建许多静态对象) )。

如果你真的只想构造一个对象,你也可以使指针(但不是指向对象)保持不变:

private:
    static QSerialPort *const obj;

这样可以防止意外再次分配(但可能会使其难以替换不同的对象进行单元测试)。

答案 1 :(得分:1)

您缺少班级名称,请通过更改

进行修复
startActivity()

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
format.setTimeZone(TimeZone.getTimeZone("GMT")); // very important, input Z means UTC+00