"Undefined reference to" 错误/静态成员变量 C++/Qt

"Undefined reference to"-error / static member var in C++/Qt

本文关键字:变量 C++ Qt 静态成员 错误 Undefined reference to      更新时间:2023-10-16

首先,我对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;
}

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

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

修复方法是更改

QSerialPort *obj = new QSerialPort();

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

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

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

private:
    static QSerialPort *const obj;

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

您缺少类名,请通过更改来修复它

QSerialPort *obj = new QSerialPort();

进入

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