目录
前言
工作了一年半了(如果加实习就19个月了),对C/C++有了新的认识,关于extern和namespace也有了进一步认识,在此记录下!
关于extern的认识
先上一段代码,运行截图如下:
源码如下:
Head1.h
#ifndef HEAD1_H
#define HEAD1_H
#include <iostream>
using namespace std;
int value1 = 9999;
void printHead1Value(){
cout << "printHead1Value : " << value1 << endl;
}
#endif
Head2.h
#ifndef HEAD2_H
#define HEAD2_H
#include "Head1.h"
extern int value1;
void printHead2Value(){
cout << "printHead2Value : " << value1 << endl;
}
void changeValue(){
value1 = -1;
}
#endif
main.cpp
#include "Head2.h"
int main(int *argc, int *argv[]){
cout << "The value1 is :" << value1 << endl;
printHead1Value();
changeValue();
printHead2Value();
printHead1Value();
getchar();
return 0;
}
这里通过使用extern,就可以调用不同文件的变量,但是如果在main.cpp中创建一个同名的全局value1,就会报错,如下
报错如下:
这个方式,个人感觉的确有缺陷,不太好,所以就有了C++的namespace。
关于namspace的认识
运行截图如下:
源码如下:
Head1.h
#ifndef HEAD1_H
#define HEAD1_H
#include <iostream>
using namespace std;
namespace HelloWorld{
int goloab = 1000;
void printValue(){
cout << "HelloWorld printValue : " << goloab << endl;
}
}
#endif
Head2.h
#ifndef HEAD2_H
#define HEAD2_H
#include <iostream>
using namespace std;
namespace IamFineThankYou{
int goloab = 998;
void printValue(){
cout << "IamFineThankYou printValue : " << goloab << endl;
}
}
#endif
main.cpp
#include "Head1.h"
#include "Head2.h"
int goloab = 8888;
int main(int *argc, int *argv[]){
cout << "The goloab is : " << goloab << endl;
HelloWorld::printValue();
IamFineThankYou::printValue();
getchar();
return 0;
}
通过namespace就可以很好的解决extern中存在的问题,并且还可以搞很多同名的函数。感觉这个namespace的确是很方便,下面是本人对namespace在Qt中的认识。
关于namespace在Qt中的认识
如下的程序结构:
这里只看2个.h文件
form.h
#ifndef FORM_H
#define FORM_H
#include <QWidget>
namespace Ui {
class Form;
}
class Form : public QWidget
{
Q_OBJECT
public:
explicit Form(QWidget *parent = nullptr);
~Form();
private slots:
void on_pushButton_clicked();
private:
Ui::Form *ui;
};
#endif // FORM_H
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
这里可以看到2个.h文件,都有nameSpace Ui class Widget。另外一个是Form,这里要注意了
因为命名空间的不同,这两个是不同的类,点进去就可以看到!进入了ui_widget.h或ui_form.h,
下面来看看ui_form.h的部分代码!
发现Form中他继承了Ui_Form
就有了setupUi这个函数。从中可以看到。namespace这个把每一个界面都给它隔开了,通过这样的方式,也就实现了Qt中界面与逻辑业务的分离!