如果在类的里面声明了内联的析构函数,会导致使用前置声明有问题,见代码(报错代码):
#pragma once
#include <QObject>
#include <QScopedPointer>
class CScreenTracker;
class CScreenshot : public QObject
{
Q_OBJECT
public:
CScreenshot(QObject *parent = Q_NULLPTR);
//注意这里!!!
~CScreenshot() = default;
private:
QScopedPointer<CScreenTracker> _tracker;
};
正确代码:
#pragma once
#include <QObject>
#include <QScopedPointer>
class CScreenTracker;
class CScreenshot : public QObject
{
Q_OBJECT
public:
CScreenshot(QObject *parent = Q_NULLPTR);
//注意这里的析构函数,放在cpp里面实现,或删除使用默认实现
~CScreenshot();
private:
QScopedPointer<CScreenTracker> _tracker;
};
原因,如果是内联函数,会在头文件里面调用智能指针指向对象的析构,如果没有对象的完整实现,那么析构函数自然也无法正常调用。所以,使用内联函数时要多留意。