自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

lihaidong的博客

记录点点滴滴,每天进步一点点

  • 博客(35)
  • 收藏
  • 关注

转载 玩转Google开源C++单元测试框架Google Test系列(gtest)之八 - 打造自己的单元测试框架

一、前言上一篇我们分析了gtest的一些内部实现,总的来说整体的流程并不复杂。本篇我们就尝试编写一个精简版本的C++单元测试框架:nancytest ,通过编写这个简单的测试框架,将有助于我们理解gtest。二、整体设计使用最精简的设计,我们就用两个类,够简单吧:1. TestCase类包含单个测试案例的信息。 2. UnitTest类负责所有测试案例的执行,管理。三、TestCase类TestC...

2018-02-28 09:55:52 292

转载 玩转Google开源C++单元测试框架Google Test系列(gtest)之七 - 深入解析gtest

一、前言“深入解析”对我来说的确有些难度,所以我尽量将我学习到和观察到的gtest内部实现介绍给大家。本文算是抛砖引玉吧,只能是对gtest的整体结构的一些介绍,想要了解更多细节最好的办法还是看gtest源码,如果你看过gtest源码,你会发现里面的注释非常的详细!好了,下面就开始了解gtest吧。二、从TEST宏开始前面的文章已经介绍过TEST宏的用法了,通过TEST宏,我们可以非法简单、方便的...

2018-02-28 09:55:14 146

转载 玩转Google开源C++单元测试框架Google Test系列(gtest)之六 - 运行参数

一、前言使用gtest编写的测试案例通常本身就是一个可执行文件,因此运行起来非常方便。同时,gtest也为我们提供了一系列的运行参数(环境变量、命令行参数或代码里指定),使得我们可以对案例的执行进行一些有效的控制。二、基本介绍前面提到,对于运行参数,gtest提供了三种设置的途径:1. 系统环境变量2. 命令行参数3. 代码中指定FLAG因为提供了三种途径,就会有优先级的问题, 有一个原则是,最后...

2018-02-28 09:54:20 565

转载 玩转Google开源C++单元测试框架Google Test系列(gtest)之五 - 死亡测试

一、前言“死亡测试”名字比较恐怖,这里的“死亡”指的的是程序的崩溃。通常在测试过程中,我们需要考虑各种各样的输入,有的输入可能直接导致程序崩溃,这时我们就需要检查程序是否按照预期的方式挂掉,这也就是所谓的“死亡测试”。gtest的死亡测试能做到在一个安全的环境下执行崩溃的测试案例,同时又对崩溃结果进行验证。二、使用的宏Fatal assertionNonfatal assertionVerifie...

2018-02-28 09:53:41 319

原创 玩转Google开源C++单元测试框架Google Test系列(gtest)之四 - 参数化

一、前言在设计测试案例时,经常需要考虑给被测函数传入不同的值的情况。我们之前的做法通常是写一个通用方法,然后编写在测试案例调用它。即使使用了通用方法,这样的工作也是有很多重复性的,程序员都懒,都希望能够少写代码,多复用代码。Google的程序员也一样,他们考虑到了这个问题,并且提供了一个灵活的参数化测试的方案。二、旧的方案为了对比,我还是把旧的方案提一下。首先我先把被测函数IsPrime帖过来(在...

2018-02-28 09:52:59 311

转载 玩转Google开源C++单元测试框架Google Test系列(gtest)之三 - 事件机制

一、前言gtest提供了多种事件机制,非常方便我们在案例之前或之后做一些操作。总结一下gtest的事件一共有3种:1. 全局的,所有案例执行前后。2. TestSuite级别的,在某一批案例中第一个案例前,最后一个案例执行后。3. TestCase级别的,每个TestCase前后。二、全局事件要实现全局事件,必须写一个类,继承testing::Environment类,实现里面的SetUp和Tea...

2018-02-28 09:52:13 204

转载 玩转Google开源C++单元测试框架Google Test系列(gtest)之二 - 断言

一、前言这篇文章主要总结gtest中的所有断言相关的宏。 gtest中,断言的宏可以理解为分为两类,一类是ASSERT系列,一类是EXPECT系列。一个直观的解释就是:1. ASSERT_* 系列的断言,当检查点失败时,退出当前函数(注意:并非退出当前案例)。 2. EXPECT_* 系列的断言,当检查点失败时,继续往下执行。二、示例// int型比较,预期值:3,实际值:Add(1, 2)EXP...

2018-02-28 09:51:27 303

转载 玩转Google开源C++单元测试框架Google Test系列(gtest)之一 - 初识gtest

一、前言本篇将介绍一些gtest的基本使用,包括下载,安装,编译,建立我们第一个测试Demo工程,以及编写一个最简单的测试案例。 二、下载如果不记得网址, 直接在google里搜gtest,第一个就是。三、编译下载解压后, 里面有个msvc目录: 使用VS的同学可以直接打开msvc里面的工程文件, 如果你在使用的是VS2005或是VS2008,打开后会提示你升级,升完级后,我们直接编译里面的“gt...

2018-02-28 09:46:19 219

转载 产生随机数的好方法random_shuffle()

假设你需要指定范围内的随机数,传统的方法是使用ANSI C的函数random(),然后格式化结果以便结果是落在指定的范围内。但是,使用这个方法至少有两个缺点。首先,做格式化时,结果常常是扭曲的,所以得不到正确的随机数(如某些数的出现频率要高于其它数)其次,random()只支持整型数;不能用它来产生随机字符,浮点数,字符串或数据库中的记录。对于以上的两个问题,C++中提供了更好的解决方法,那就是r...

2018-02-27 16:01:00 18126 2

原创 Effective C++学习笔记(七)

继承与面向对象设计1.确定你的public继承塑模出 is-a 的关系      Public 继承意味着”is-a”(是一种)的关系。也就是说使用public继承,每一个Derived类的对象同时也是一个Base class对象,适用于base class身上的没一件事一定也适用于Derived calss。2.避免遮掩继承而来的名称      Derived类内成员函数内变量名字查找规则:先在...

2018-02-27 15:55:03 95

原创 Effective C++学习笔记(六)

实现1.尽量少做转型动作旧式转型:    C++新式转型:      2.避免返回handles指向对象的内部成分引用、指针和迭代器统统都是所谓的handles(号码牌,用来取得某个对象),而返回一个“代表对象内部数据”的handles,随之而来的是“降低对象封装性”的风险,同时,它可能导致“虽然调用const成员函数却造成对象状态被改变”。class Point{public:    Point...

2018-02-27 15:54:21 144

原创 Effective C++学习笔记(五)

设计与声明1.必须返回对象时,别妄想返回其reference    在上一条款的学习中我们领悟到了 pass by value 的缺点及 pass by reference 的优势,但这并不意味着我们任何时刻都是应该采用reference传递,因为引用必须作用在一个已经存在的对象上,当企图对一个不存在的对象上引用将发生错误。    函数内部产生新对象有两种: on the stack 和 on t...

2018-02-27 15:53:24 102

原创 Effective C++学习笔记(四)

设计与声明1.设计class犹如设计type设计class前需要注意的问题:新type的对象应该如何创建和销毁--构造函数和析构函数对象的初始化和对象的赋值--构造函数和赋值操作符新type对象的 pass by value新type对象的“合法值”继承图系类型转换pubilc、protected、private成员函数 是否需要一个新type2.宁以 pass-by-reference-to-c...

2018-02-27 15:52:41 137

原创 Effective C++学习笔记(三)

设计与声明1.让接口容易被正确使用,不易被误用问题引入:考虑一个表现日期的构造函数:class Date{public:    Date(int month, int day, int year);    …};        上述代码看似很正确,但对于用户来说容易犯错误,三个参数顺序不易区别,如:Date d1(30,3,1995);  // 月和日参数颠倒,但程序并不会报错Date d2(2,...

2018-02-27 15:51:04 104

原创 Effective C++学习笔记(二)

资源管理1.以对象管理资源手动删除:           当factory函数发生异常,或者{...}代码段发生过早的return语句等提前跳出f()函数,则不会执行delete语句,从而造成内存泄露auto_ptr:             获取对象时立即放进管理对象,管理对象利用析构函数确保资源被释放。由于auto_ptr被销毁时会自动删除所指之物,所以应避免多个auto_ptr指向同一个对象...

2018-02-27 15:50:18 175

原创 Effective C++学习笔记(一)

让自己习惯C++1.确定对象被使用前已先被初始化   类的构造函数的赋值初始化:   类的构造函数的列表初始化(更高效):构造/析构/赋值函数2.了解C++默默编写并调用哪些函数    如果自己没有声明,编译器就会为类声明一个default 构造函数,copy构造函数,一个copy assignment操作符和一个析构函数。    记住:  C++不允许让reference指向不同的对象  C++...

2018-02-27 15:49:15 178

转载 cin、cin.get()、cin.getline()、getline()、gets()等函数的用法

1、cin>>          用法1:最基本,也是最常用的用法,输入一个数字:#include <iostream> using namespace std; main () { int a,b; cin>>a>>b; cout<<a+b<<endl; }输入:2[回车]3[回车] 输出:5注意:>> 是会过滤

2018-02-27 15:42:47 84

转载 c++工厂模式(Factory method)

下面以女娲造黑人,白人,黄种人的例子来介绍一下工厂模式。1.工厂的接口,相当于造人工厂总部。class IHumanFactory{public: IHumanFactory(void) { } ~IHumanFactory(void) { } virtual IHuman* CreateHuman() = 0;}...

2018-02-27 15:41:57 170

原创 阻止拷贝构造和拷贝赋值

 如果一个类需要自己定义析构函数,往往需要自己定义拷贝构造和拷贝赋值,系统默认合成的拷贝构造和拷贝赋值知识简单的拷贝指针成员,意味着可能会造成多个指针指向同一个内存。class A{private: B* m_data;}A a1;A a2(a1);delete a2; // a1和a2同时被销毁A a3(a1); // a3指向无效内存解决方法一: 将拷贝构造函数和拷贝赋值函数设置为 p...

2018-02-27 15:40:19 717

转载 VS2010 常用快捷键 (2)

1: Ctrl + Enter (在光标指定位置的上面添加一行,并将光标移至新添加行的行首位置)  Ctrl + Shift + Enter (在光标指定位置的下面添加一行,并将光标移至新添加行的行首位置)2: Ctrl + Shift + L (删除当前行)3: Ctrl + M + O (折叠所有的函数)  Ctrl + M + P (展开所有的函数)4: Ctrl + E + C (注释) ...

2018-02-27 15:39:35 144

转载 VS快捷键

命令名快捷键说明编辑.折叠到定义Ctrl + M,Ctrl + O自动确定在代码中创建区域的逻辑边界(如过程),然后隐藏它们。编辑.注释选定内容Ctrl + K,Ctrl + C使用编程语言的正确注释语法将代码的当前行标记为注释。(vc2003)编辑.完成单词Ctrl + j Alt + 向右键显示基于当前语言的“完整单词”。(vc2003)编辑.删除Delete删除光标右侧的一个字符。编辑.向后...

2018-02-27 15:38:35 359

原创 电脑操作技巧

          

2018-02-27 15:37:17 162

转载 GitHub C 和 C++ 开源库的清单(含示例代码)

内容包括:标准库、Web应用框架、人工智能、数据库、图片处理、机器学习、日志、代码分析等。 标准库C++标准库,包括了STL容器,算法和函数等。C++ Standard Library:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分。Standard Template Library:标准模板库C POSIX library : POSIX系统的C标准库规范ISO C+...

2018-02-27 15:35:50 5969

转载 敏捷开发之Scrum扫盲篇

什么是敏捷开发?敏捷开发(Agile Development)是一种以人为核心、迭代、循序渐进的开发方法。怎么理解呢?首先,我们要理解它不是一门技术,它是一种开发方法,也就是一种软件开发的流程,它会指导我们用规定的环节去一步一步完成项目的开发;而这种开发方式的主要驱动核心是人;它采用的是迭代式开发; 为什么说是以人为核心?我们大部分人都学过瀑布开发模型,它是以文档为驱动的,为什么呢?因为在瀑布的整...

2018-02-27 15:33:58 365

转载 Qt QLineEdit 限制输入类型以及大小Int 和double

在使用QLineEdit输入数值时,经常遇到限制其范围的需要,比如角太阳高度角范围为[-90,90],经度值范围[-180,180],方位角范围[0,360]。Qt提供了QIntValidator和QDoubleValidator可以限定数值输入范围,如使用QIntValidator限制整数的数值范围:例1:[cpp] view plain copylineEdit->setValidato...

2018-02-27 15:33:10 2002 1

转载 将Access数据库导入到SQLite最简单最实用的方法

(用SQLite Expert Professional 工具) 首先要下载SQLite Expert Professional 工具,新建一个数据库,然后就可以按照下面的步骤将access数据库转换成sqlite数据库了。通过SQLite Expert创建数据库,然后import --〉Data Transfer Wizard--〉import data into...--〉ADO Data S...

2018-02-27 15:32:14 3794 1

转载 C++宏中的do{}while(0)

如果你是C++程序员,我有理由相信你用过,或者接触过,至少听说过MFC, 在MFC的afx.h文件里面, 你会发现很多宏定义都是用了do...while(0)或do...while(false), 比如说: #define AFXASSUME(cond) do { bool __afx_condVal=!!(cond); ASSERT(__afx_condVal); __analysis_assu...

2018-02-27 15:30:37 378

原创 C++ 全排列函数 std::next_permutation与std::prev_permutation

C++ STL中提供了std::next_permutation与std::prev_permutation可以获取数字或者是字符的全排列,其中std::next_permutation提供升序、std::prev_permutation提供降序。1.std::next_permutation函数原型  template <class BidirectionalIterator>  b...

2018-02-27 15:28:28 320

转载 C/C++基本数据类型所占字节数

有几条铁定的原则(ANSI/ISO制订的):sizeof(short int)<=sizeof(int)sizeof(int)<=sizeof(long int)short int至少应为16位(2字节)long int至少应为32位。下面给出不同位数编译器下的基本数据类型所占的字节数:16位编译器char :1个字节char*(即指针变量): 2个字节short int : 2个字节...

2018-02-27 15:26:40 780

转载 关于C和C++中的基本数据类型int、long、long long、float、double、char、string的大小及表示范围

一、基本类型的大小及范围的总结(以下所讲都是默认在32位操作系统下):字节:byte;位:bit。1.短整型short:所占内存大小:2byte=16bit;所能表示范围:-32768~32767;(即-2^15~2^15-1)2.整型int:所占内存大小:4byte=32bit;所能表示范围:-2147483648~2147483647;(即-2^31~2^31-1)   unsigned:  ...

2018-02-27 15:25:27 1512

转载 在VS中添加lib库的三种方法

注意:1、每种方法也要复制相应的DLL文件到相应目录,或者设定DLL目录的位置,具体方法为:"Properties" -> "Configuration Properties" -> "Debugging",在"Working Directory"设置dll的路径就可以了2、无论是设置DLL目录,或者是Lib目录,亦或是头文件的目录,都有release版本和debug版本的区分,每种版...

2018-02-27 15:24:08 177

转载 c/c++ mysql api函数

详细说明请参阅官网:http://dev.mysql.com/doc/refman/5.1/zh/apis.html#c-api-functions函数描述mysql_affected_rows()返回上次UPDATE、DELETE或INSERT查询更改/删除/插入的行数。mysql_autocommit()切换 autocommit模式,ON/OFFmysql_change_user()更改打开...

2018-02-27 15:21:44 1515

原创 strlen和sizeof有什么区别?

1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。 2.sizeof是算符,strlen是函数。 3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。sizeof还可以用函数做参数,比如: short f();printf("%d\n", size...

2018-02-27 15:20:10 254

转载 聊聊 Qt 的 new 、delete

在C++中学习过程中,我们都知道:delete 和 new 必须 配对使用(一 一对应):delete少了,则内存泄露,多了麻烦更大。Qt作为C++的库,显然是不会违背C++的前述原则的。可是:在Qt中,我们很多时候都疯狂地用new,却很少用delete,缺少的 delete 去哪儿了?!注:本文暂不涉及智能指针(smart pointer)相关的东西,你可以考虑 Qt 智能指针学习 一文Qt半自...

2018-02-27 15:18:35 5650

原创 《重构:改善既有代码的设计》读书笔记

重构原则1、重构的定义名词:Refactoring是对软件内部结构的一种调整,目的是在不改变外部行为的前提下,提高其可理解性,降低其修改成本; 动词:使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。2、重构的好处改进软件的设计:时间长了,随便添加新功能,已经看不出原有的设计,难以维护; 使软件更容易理解:重构的过程也可以理解代码; 帮助找到bug:“我不是...

2018-02-27 15:03:28 341

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除