为了避免头文件循环引用的问题,可以使用前向声明来解决。具体来说,可以在 globalval.h 中声明 MainWindow 类,而不是包含其头文件。然后在所有需要使用 MainWindow 类的地方,包括 mainwindow.cpp 和第三个文件中,都包含主窗口头文件 mainwindow.h

以下是示例代码:

// globalval.h
class MainWindow; // 前向声明

extern MainWindow *pThis; // 声明全局变量

// mainwindow.cpp
#include "mainwindow.h"
#include "globalval.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    pThis = this; // 保存实体指针到全局变量
}

// third.cpp
#include "mainwindow.h"
#include "globalval.h"

int someFunction()
{
    int value = pThis->ui->led_time->text().toInt(); // 使用全局变量
    // ...
}

// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

// mainwindow.cpp
#include "mainwindow.h"
#include "globalval.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    pThis = this; // 保存实体指针到全局变量
}

// third.cpp
#include "mainwindow.h"
#include "globalval.h"

int someFunction()
{
    int value = pThis->ui->led_time->text().toInt(); // 使用全局变量
    // ...
}

globalval.h 中使用 class MainWindow; 进行前向声明,告知编译器 MainWindow 是一个类。然后在 mainwindow.cppthird.cpp 中包含 mainwindow.h 来使用 MainWindow 类,并使用 extern 关键字声明全局变量 pThis,表明其定义在其他文件中。这样就解决了头文件循环引用的问题,并且可以跨文件访问全局变量。

需要注意的是,在第三个文件中使用 pThis 指针访问 UI 元素时,需要确保 MainWindow 已经创建,并且 pThis 指向有效的 MainWindow 对象。否则可能会导致程序崩溃。

C++ 多文件共享全局变量及解决头文件循环引用问题

原文地址: https://www.cveoy.top/t/topic/nuKX 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录