前先后后耗时两周的结对编程做业,我经历了不少,收获了不少,真是感受本身从一个什么都不懂的菜狗到一个伟大的程序员又进了一步啊!因为收获很是之多,下面我将一一列出。c++
因为本人以前实在太菜,因此首先恶补了C++知识,具体以下:git
C++ 在 C 语言的基础上增长了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心特性,一般被称为用户定义的类型。程序员
类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类中被称为类的成员。数据库
定义一个类,本质上是定义一个数据类型的蓝图。这实际上并无定义任何数据,但它定义了类的名称意味着什么,也就是说,它定义了类的对象包括了什么,以及能够在这个对象上执行哪些操做。类定义是以关键字 class 开头,后跟类的名称。类的主体是包含在一对花括号中。类定义后必须跟着一个分号或一个声明列表。例如,咱们使用关键字 class 定义 Box 数据类型,以下所示:编程
class Box { public: double length; // 盒子的长度 double breadth; // 盒子的宽度 double height; // 盒子的高度 };
关键字 public 肯定了类成员的访问属性。在类对象做用域内,公共成员在类的外部是可访的。另外还有private 或 protected。他们的区别好像在继承中有所体现。api
2.继承数组
面向对象程序设计中最重要的一个概念是继承。继承容许咱们依据另外一个类来定义一个类,这使得建立和维护一个应用程序变得更容易。这样作,也达到了重用代码功能和提升执行时间的效果。当建立一个类时,咱们不须要从新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员便可。这个已有的类称为基类,新建的类称为派生类。继承表明了 is a 关系。网络
一个类能够派生自多个类,这意味着,它能够从多个基类继承数据和函数。定义一个派生类,咱们使用一个类派生列表来指定基类。类派生列表以一个或多个基类命名,形式以下:app
class derived-class: access-specifier base-class
其中,访问修饰符 access-specifier 是 public、protected 或 private 其中的一个,base-class 是以前定义过的某个类的名称。若是未使用访问修饰符 access-specifier,则默认为 private。框架
当一个类派生自基类,该基类能够被继承为 public、protected 或 private 几种类型。继承类型是经过上面讲解的访问修饰符 access-specifier 来指定的。咱们几乎不使用 protected 或 private 继承,一般使用 public 继承。当使用不一样类型的继承时,遵循如下几个规则:
多继承即一个子类能够有多个父类,它继承了多个父类的特性。
好,有了上面这些东西,虽然也不是很懂,可是用于现学现卖的快开发是够用了。下面咱们来具体看看Qt。
首先我并不知道qt是什么东西,因而我上网查了下:
Qt是桌面,嵌入式和移动的跨平台应用开发框架。支持的平台包括Linux,OS X,Windows,VxWorks,QNX,Android,iOS,BlackBerry,Sailfish OS等。
Qt自己不是一种编程语言。它是一个用C ++编写的框架。但它不只仅只是一个GUI工具包,它提供了在网络,数据库,OpenGL,Web技术,传感器,通讯协议(蓝牙,串行端口,NFC),XML和JSON处理,打印,PDF生成等领域的跨平台开发的模块。
Qt拥有本身的集成开发环境(IDE),名为Qt Creator。它运行在Linux,OS X和Windows上,提供智能代码完成,语法高亮,集成帮助系统,调试器和分析器集成以及全部主要版本控制系统(例如git,Bazaar)的集成。
看完这些后我对qt仍是一头雾水,可是这并不妨碍我现学现卖。
首先,咱们来看看界面:
东西不少,组件更多。看到了这些东西后,我终于能大概看懂例程了
这就是主程序。固然了,我是基本看不懂的。可是这并不妨碍我编程,由于我发现了竟然能够拖部件编辑UI。
首先咱们来建立工程
好了,经过以上步骤,咱们就成功创建了一个窗口工程。当时以为很开心,但其实这玩意儿其实已经给之后的爆炸埋下了伏笔。没有资料参考,没人给出解释,咱们两我的就这样肝了一天一晚上。最后只知道多是编译器不支持,而后对接也变得异常麻烦。
回到正题,工程建好后,也知道拖拽,可是仍是不会写程序。为啥呢?不知道程序怎么运行的。不知道各个槽函数运行完了会回到哪里,也不知道各个按钮,layout。。。到底怎么设置,有哪些参数,窗口cpp里到底该写啥。最后咱们一顿乱写,渐渐找出的办法。
反正都要用的变量就写全局,槽函数就当中断,main里啥都不用管。
嗯,而后就一通乱写,就把程序写完了。
写的过程当中,我俩轮流主刀,另外一人就在旁边看着。常常会有想抢过键盘的冲动。咱们发现,关于实现的细节,两人讨论过多反而会拖慢进度。一段时间后,迫于时间课业压力,我俩分模块编程,速度大为提升。
1.结对编程并不适用于简单的写代码的工做,结对编程更适用于解决一些方向性的问题
2.结对编程中,双方的互动目的在于开启思路,避免单独编程时思惟容易阻塞的状况。
3.对于本身不彻底理解的任务,以及耦合度较高的任务,结对编程能够大大缩短调试及测试的时间。
4.结对编程可让别人迅速地审查本身写的代码,避免了不少的陷阱和缺陷。
5.结对编程可让同组的人分享关于系统细节的知识,而且互相学习编程技巧。
可是结对编程也有一些缺点。虽然它必定程度地缩短了开发时间,并且对代码质量产生了正的边际效益,可是它同时增长了开发人员的工做时间,也就是说与单独编程相比花费增长了。因此我以为在开发过程当中,应该先尽可能将任务分解成独立的模块,各干各活,在模块之间发生耦合的时候再进行结对编程,这样可让效率最大化。
到此为止,原本觉得就能这样结束软工做业。可是,噩梦才刚刚开始
原本觉得直接用.h就好,可是老师要求要用dll。这确实有好处。因而咱们又开始上网查资料对接,在这过程当中又学到了好多好多东西。下面详细给出:
总共有三种方法:
#include <QApplication> #include <QDebug> extern "C" //因为是C版的dll文件,在C++中引入其头文件要加extern "C" {},注意 { #include "dll.h" } int main(int argv ,char **argv) { QApplication app(argv,argv); HelloWordl(); //调用Win32 API 弹出helloworld对话框 qDebug()<<add(5,6); // dll 中我本身写的一个加法函数 return 0; //完成使命后,直接退出,不让它进入事件循环 }
隐式调用
这个时候咱们须要三个文件,头文件(.h)、导入库文件(.lib)、动态连接库(.dll),具体步骤以下:
一、首先咱们把 .h 与 .lib/.a 文件复制到程序当前目录下,而后再把dll文件复制到程序的输出目录,
二、下面咱们在pro文件中,添加 .lib 文件的位置: LIBS+= -L D:/hitempt/api/ -l myDLL
-L 参数指定 .lib/.a 文件的位置
-l 参数指定导入库文件名(不要加扩展名)
另外,导入库文件的路径中,反斜杠用的是向右倾斜的
三、在程序中include头文件(我试验用的dll是用C写的,所以要用 extern "C" { #include "dll.h" } )
上面是隐式调用的实例代码。
隐式调用至关简洁,可是咱们尝试了一天,用尽各类办法以后,就是有问题。最终咱们得知,咱们的编译器不支持。咱们以不知道这是什么鬼畜缘由,而后就只能尝试最麻烦的显示调用
3.显示调用
#include <QApplication> #include <QLibrary> #include <QDebug> #include <QMessageBox> #include "dll.h" //引入头文件 typedef int (*Fun)(int,int); //定义函数指针,以备调用 int main(int argc,char **argv) { QApplication app(argc,argv); QLibrary mylib("myDLL.dll"); //声明所用到的dll文件 int result; if (mylib.load()) //判断是否正确加载 { QMessageBox::information(NULL,"OK","DLL load is OK!"); Fun open=(Fun)mylib.resolve("add"); //援引 add() 函数 if (open) //是否成功链接上 add() 函数 { QMessageBox::information(NULL,"OK","Link to Function is OK!"); result=open(5,6); //这里函数指针调用dll中的 add() 函数 qDebug()<<result; } else QMessageBox::information(NULL,"NO","Linke to Function is not OK!!!!"); } else QMessageBox::information(NULL,"NO","DLL is not loaded!"); return 0; //加载失败则退出28}
如上,每一个函数都要改,能够说是至关麻烦了。并且每一个组的函数名还不同,因此对接是一项很是单调有无聊的工做。
这并不算完。
因为采用了显式调用,函数名是必需要知道的。可是我也不知到为何反正core组的函数名就是否是简简单单看到的那样,而是还要加上各类乱七八糟的东西。没有经验的咱们又卡了老半天。最后用了个什么depend看了函数名,最后才终于能够用了。
而后就是对接操做。前两组设置和调用方式差很少,都是结构体设置+数组存储,对接起来稍快。后来有的组参数稍多,设置方式不一样,存取模式也不同,有的又是文件读取,修改复杂度很大。不一样编译器又时不时的叫错,至关繁琐。值得高兴的是,大部分组的鲁棒性都很好,极少出现崩溃的状况。
对接收获:
小结:
说了这么多,以上都是次要的。此次结对做业最最重要的收获固然是磨练了个人意志品质,培养了我细致耐心的性格,自我情绪管理以及欠多少做业都不慌的淡定。