C++ class 类的嵌套
前言
· 为了在 Qt 内的其他函数中也能正常的使用 MainWindow w 这个对象
1 extern 指针变量
· 可是直接都把使用 MainWindow w 的行为都写在 MainWindow w 本身中不就可以完美的解决了吗?
· 但是有些特殊的条件,你没办法把这个行为写在 MainWindow w 本身中,就只能采取 extern 指针变量的方法(eg:Linux 中的信号处理服务函数,就无法写入MainWindow w 本身中,但该函数又要使用 MainWindow w 就需采取当前的方法 )
· 我首先想到的是把 MainWindow w 变成外部变量,但是这是无法做到的!
· MainWindow w 是必须在 QApplication a(argc, argv) 后创建的,不然编译器会报错,所以只能在 main 函数中局部的创建 MainWindow w
· 虽然没办法把 MainWindow w 变成外部变量,但是可以创建指向 MainWindow w 外部指针,指针在 MainWindow w 的解析函数中初始化
1.1 定义指针
/* main.cpp */
MainWindow *ww = NULL;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
· 在 main.cpp 中创建 MainWindow *ww 指针
1.2 声明指针
/* mainwindow.h */
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
extern MainWindow *ww;
#endif // MAINWINDOW_H
· 在 mainwindow.h 声明外部变量 ww
1.3 初始化指针
/* mainwindow.cpp */
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
extern MainWindow *ww;
ww = this;
ui->setupUi(this);
}
· 在 MainWindow 的解析函数中初始化 ww 指针
1.4 调用指针
/* mycode.cpp */
#include "mainwindow.h"
void trytry(void){
extern MainWindow *ww;
ww->function();
}
· 其他源文件在包含 mainwindow.h 的头文件后,即可通过指针的形式访问 MainWindow w
2 class 类的嵌套
· 若是认为指针的传递局部变量的行为存在安全隐患,直接在 MainWindow 类中添加对应的函数或是使用类的嵌套也能实现使用
· 但我更倾向于嵌套的使用类,对于我来说这样框架更清晰可见
2.1 嵌套类并添加嵌套对象指针
/* mainwindow.h */
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
class TRY{
public:
void show(void);
protected:
private:
};
TRY *try;
private slots:
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
· 在 mainwindow.h 中添加 TRY 类,并添加 TRY *try 指针
2.2 初始化对象指针和实现嵌套类
/* mainwindow.cpp */
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
try = new TRY();
}
MainWindow::~MainWindow()
{
delete try;
delete ui;
}
void MainWindow::TRY::show(void){
// code
}
· 在 mainwindow.cpp 的解析函数中初始化 TRY *try 指针和在析构函数中释放 TRY *try 指针,并实现嵌套的类
2.3 使用嵌套类
/* main.cpp */
MainWindow *ww = NULL;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w::try->show();
w.show();
return a.exec();
}
· 在 main.cpp 中使用嵌套的类