C++|用Visual Studio配置GTest

第一步.下载源代码

Google Test的Github下载最新的Release的zip。解压。

第二步.cmake创建工程

打开Developer Prompt For VS 2019,cd进解压出来的文件夹(见上图)里的googletest子目录,执行:

cmake .

会自动侦测出是在VS环境,生成sln文件。打开sln。

第三步.生成lib文件

gtest实际上就两个lib文件,一个用于Debug,一个用于Release。打开sln之后,下图里的Debug生成一次,改成Release再生成一次:

生成的文件就在sln文件同目录下的lib文件夹里,对应的Debug、Release两个文件夹:

把lib文件夹复制到随便能找到的地方,在正在开发的解决方案里配置“链接器”相关属性即可。

Extra.更改配置为lib

gtest是对lib进行测试的,所以如果开始时用了exe配置,跑unit test的时候就会报错LNK2019,要改成lib:

C++|copy-and-swap idiom

copy-and-swap是为了赋值操作符和move构造器能够更优雅(而且稳定)地完成工作而出现的。Rule Of Three要求自己定义的类如果提供了以下其中之一,就要提供全部:

  1. 析构器
  2. 复制构造器
  3. 复制赋值操作符

C++11就成了Rule Of Five

  1. 复制构造器
  2. 复制赋值操作符
  3. 析构器
  4. 移动构造器
  5. 移动赋值操作符

废话不多说,直接写比较成熟的方案,来自于Stack Overflow

class AClass{
int length_;
int * array;
public:
...
    friend void swap(AClass & dest, AClass& src) noexcept {
        using std::swap;
        swap(dest.length_, src.length_);
        swap(dest.array, src.array);
    }
};

核心就是这个swap方法,用到了ADL——为了满足ADL所以要写成friend,更深入的原因看这个

有了swap之后,就可以把移动构造器写成这样:

AClass::AClass(AClass&& another) noexcept : AClass() {
    swap(*this,another);
}

需要调用默认构造器来先把this给设置好,再swap。

然后把赋值构造器统一成:

AClass& operator=(AClass another){
    swap(*this,another);
    return *this;
};

所以Rule of Five就会变成Rule of Four and A Half.

这种方法对于只控制一个资源的class很有效,但是习惯上,一个class只应该控制一个资源,多个资源会带来混乱和麻烦。