C++|Qt笔记-关于extern和namespace的区别与联系

581 篇文章 121 订阅
384 篇文章 18 订阅

目录

 

前言

关于extern的认识

关于namspace的认识

关于namespace在Qt中的认识


 

前言

工作了一年半了(如果加实习就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中界面与逻辑业务的分离!

  • 32
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值