C++ 多文件共享全局变量及解决头文件循环引用问题
为了避免头文件循环引用的问题,可以使用前向声明来解决。具体来说,可以在 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.cpp 和 third.cpp 中包含 mainwindow.h 来使用 MainWindow 类,并使用 extern 关键字声明全局变量 pThis,表明其定义在其他文件中。这样就解决了头文件循环引用的问题,并且可以跨文件访问全局变量。
需要注意的是,在第三个文件中使用 pThis 指针访问 UI 元素时,需要确保 MainWindow 已经创建,并且 pThis 指向有效的 MainWindow 对象。否则可能会导致程序崩溃。
原文地址: https://www.cveoy.top/t/topic/nuKX 著作权归作者所有。请勿转载和采集!