GMock学习笔记
1. Mock与Fake1.1. fakes(伪对象)和mock(模拟器)在测试驱动开发(TDD)社区中实际上往往意味着非常不同的东西: Fake有工作实现,但通常采取一些捷径(可能使操作更简单),这使得它们不适合生产。内存中的文件系统是一个fake的例子。 Mock是预期编程的对象,它们形成它们期望接收的调用的规范。 1.2. 使用Google Mock涉及三个基本步骤: 使用一些简单的宏描述你想要模拟的接口,他们将扩展到你的mock类的实现; 创建一些模拟对象,并使用直观的语法指定其期望和行为; 练习使用模拟对象的代码。 Google Mock会在出现任何违反期望的情况时立即处理。 在代码中有依赖,比如代码依赖ABC.cpp文件里的方法。这些方法还没有实现,这是应该是拿到了这些包含了这些方法的定义的头文件,ABC.h。 创建一个Fake程序,Fake_ABC.cpp和Fake_ABC.h. 在Fake_ABC.h里include ABC.h. 并定义新的行为Fake_action_1(), Fack_action_2(). 这些行为多数是用来帮助获取Fak...
C++ string转enum
1. 问题前阵子遇到个问题,需要传递接口的admin状态,是这么定义的: 12345enum IfaceAdminStatus{ up, down}; 然后从API上获取的接口又是string类型: 1234567891011121314151617181920struct EtherIfaces{ std::string ifaceName; std::string adminState; EtherIfaces(const std::string &ifaceName_, const std::string &adminState_): ifaceName(ifaceName_), adminState(adminState_) { } EtherIfaces() { } ~EtherIfaces() { }}; 所以需要将string转enum处理。因为是C++小白,只能去...
C++ 并发编程
自C++11标准以来,C++语言开始支持多线程模型。借助多线程模型,我们可以开发出更好的并发系统。本文以C++语言为例,讲解如何进行并发编程。并尽可能涉及C++11,C++14以及C++17中的主要内容。 1. 前言1.1. 为什么要并发编程大型的软件项目常常包含非常多的任务需要处理。例如:对于大量数据的数据流处理,或者是包含复杂GUI界面的应用程序。如果将所有的任务都以串行的方式执行,则整个系统的效率将会非常低下,应用程序的用户体验会非常的差。 另一方面,自上个世纪六七十年代英特尔创始人之一 Gordon Moore 提出 摩尔定律以来,CPU频率以每18个月翻一番的指数速度增长。但这一增长在最近的十年已经基本停滞,大家会发现曾经有过一段时间CPU的频率从3G到达4G,但在这之后就停滞不前了。因此最近的新款CPU也基本上都是3G左右的频率。相应的,CPU以更多核的形式在增长。目前的Intel i7有8核的版本,Xeon处理器达到了28核。并且,最近几年手机上使用的CPU也基本上是4核或者8核的了。 由此,掌握并发编程技术,利用多处理器来提升软件项目的性能将是软件工程师的一项...
搭建Typora+hexo环境
本文记录了作者如何搭建 Typora 与 Hexo 的博客环境。先说明为何放弃 Typora 的 Upload Image 功能,改用 PicGo 与 GitHub 作为图床;随后讨论将 Typora 文章迁移至 Hexo 时图片无法加载的问题,并给出通过自定义 asset_img 标签或脚本自动转换图片路径的解决方案。最后提到计划使用 Jenkins 自动化部署。
学习C++ - 不常见概念解释
模板相关1. Dependent Namehttps://en.cppreference.com/w/cpp/language/dependent_name 在涉及到模板时,如果引用模板参数中的符号,那么这个符号就是dependent name,即依赖于模板实例化才能确定符号类型。 1.1. Binding Rules不依赖模板参数的符号是在模板定义时绑定的。如果绑定时和模板实例化时,同一个符号的含义发生了变化,那程序可能会出问题。 1.2. Lookup Rules依赖模板参数的符号是在模板实例化时才去绑定的。 1.2.1. 非ADL非ADL的情况下,只会在模板定义的上下文寻找符号定义; 下面的例子中,writeObject方法的模板参数类型并不是用户命名空间中定义的,因此对应非ADL场景,只会在模板定义上下文寻找 operator << (std::ostream& os, std::vector&) 符号的定义,不会去用户命名空间中查找: 12345678910111213141516171819202122232425262728293...
学习C++ - 艰难的熟悉过程
1. using声明https://en.cppreference.com/w/cpp/language/using_declaration 自C++11开始,除了可以使用using引入命名空间所有符号外,还可以使用using来定义类型别名,以及使用using为子类引入父类定义的函数,包括构造函数; 昨天晚上读React-Native源码时,发现调用了一个类的构造函数,但是并没有找到这个构造函数的定义在哪里,找了很久才发现看漏了一行using,原来子类是通过using将父类的构造函数全部引入了进来。 如果子类使用using引入父类构造函数会有一些需要注意的点,第一个是引入时,会将父类的所有构造函数一次性的全部引入到子类,如果子类中新定义的所有成员都能进行隐式的初始化,那就可以直接使用using引入的父类构造函数方法来实例化子类实例了。 如果子类自己定义了函数,并且签名和using引入的函数的签名一样,那么using引入的函数会被隐藏。 例如: 123456789101112131415161718192021222324struct B1 { B1(int, ...) { }...
C++ Struct的使用
1. C++中的结构体在C语言中,结构体不能包含函数。 在面向对象的程序设计中,对象具有状态(属性)和行为,状态保存在成员变量中,行为通过成员方法(函数)来实现。 C语言中的结构体只能描述一个对象的状态,不能描述一个对象的行为。在C++中,考虑到C语言到C++语言过渡的连续性,对结构体进行了扩展,C++的结构体可以包含函数,这样,C++的结构体也具有类的功能,与class不同的是,结构体包含的函数默认为public,而class中默认是private。 C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。 struct能包含成员函数吗? 能! struct能继承吗? 能!! struct能实现多态吗? 能!!! 2. 结构体的定义与声明实例代码1: 1234567891011struct tag { member-list;}variable-list;/*注:struct为结构体关键字; tag为结构体的标志; member-list为结构体成员变量及成...
C++ bind的使用
1. 可调用对象可调用对象有一下几种定义: 是一个函数指针,参考 C++ 函数指针和函数类型; 是一个具有operator()成员函数的类的对象; 可被转换成函数指针的类对象; 一个类成员函数指针; C++中可调用对象的虽然都有一个比较统一的操作形式,但是定义方法五花八门,这样就导致使用统一的方式保存可调用对象或者传递可调用对象时,会十分繁琐。C++11中提供了std::function和std::bind统一了可调用对象的各种操作。 不同类型可能具有相同的调用形式,如: 123456789101112// 普通函数int add(int a, int b){return a+b;} // lambda表达式auto mod = [](int a, int b){ return a % b;}// 函数对象类struct divide{ int operator()(int denominator, int divisor){ return denominator/divisor; }}; 上述三种可调用对象虽然类型不同,但是共享了一种调用形式:...
C++ stdbind的使用
1. 可调用对象可调用对象有一下几种定义: 是一个函数指针,参考 C++ 函数指针和函数类型; 是一个具有operator()成员函数的类的对象; 可被转换成函数指针的类对象; 一个类成员函数指针; C++中可调用对象的虽然都有一个比较统一的操作形式,但是定义方法五花八门,这样就导致使用统一的方式保存可调用对象或者传递可调用对象时,会十分繁琐。C++11中提供了std::function和std::bind统一了可调用对象的各种操作。 不同类型可能具有相同的调用形式,如: 123456789101112// 普通函数int add(int a, int b){return a+b;} // lambda表达式auto mod = [](int a, int b){ return a % b;}// 函数对象类struct divide{ int operator()(int denominator, int divisor){ return denominator/divisor; }}; 上述三种可调用对象虽然类型不同,但是共享了一种调用形式:...
深入理解C++11
1. 前言1.1. 说到C++11,应该想到什么? 什么是 lambda,及怎么样使用它是最好的? decltype 和 auto 类型推导有什么关系? 什么是移动语义,以及(右值引用)是如何解决转发问题的? default/deleted 函数以及 override 是怎么回事? 异常描述符被什么替代了? noexcept 是如何工作的? 什么是原子类型以及新的内存模型? 如何在 C++11 中做并行编程? 1.2. 语言的哪些关键字和C++11有关? alignas alignof decltype auto(重新定义) static_assert using(重新定义) noexcept export(弃用,不过未来可能留作他用) nullptr constexpr thread_local 2. 保证稳定性和兼容性2.1. 将C99标准纳入C++112.1.1. 确定编译环境的预定义宏 STDC_HOSTED:编译器的目标系统环境中是否包含完整的C库 STDC:编译器对于标准C库的实现是否和C标准一致(是否定义、如何定义由编译器决定) STDC_VERSI...

