当前位置: 首页 > 科技观察

C++中一个非常好用的设计模式介绍

时间:2023-03-12 19:26:23 科技观察

本文转载自微信公众号《程序喵大师》,作者程序喵大师。转载本文请联系程序大师喵公众号。大家好,今天给大家介绍一个C++中很常见的模式:pimpl,至于它是做什么的,看代码就可以了://MyClass.hclassMyClass{public:voidfunc1();voidfunc2();private:voidfunc3();voidfunc4();inta;intb;};假设我们正在开发一个SDK,或者设计某个模块,我们需要暴露一个MyClass.h头文件,并为用户提供函数func1和func2。但是MyClass中有一些私有的函数和字段。我们可能不希望用户知道这些功能和字段,因为其中可能包含一些隐私内容。用户可能会通过这些私有方法和字段猜测我们的架构和实现。这也是我们通常在设计模块时需要注意的:只暴露该暴露的。那怎么办呢?答案是pimpl模式。它可以是这样的://MyClass.hclassMyClass{public:voidfunc1();voidfunc2();private:classimpl;impl*pimpl;};//MyClass.ccclassMyClass::impl{public:voidfunc1();voidfunc2();private:voidfunc3();voidfunc4();inta;intb;};MyClass::MyClass(){pimpl=newimpl;}voidMyClass::func1(){pimpl->func1();}隐藏了私有属性类变成一个内部类,然后通过指针访问(预先声明)它的接口。头文件中只暴露了该暴露的函数,然后持有一个指向Impl的指针,而Impl具体定义在My??Class.cc中,用户看不到任何东西。那么所有的功能都是通过Impl来完成的。头文件中的Impl指针也可以用智能指针(unique_ptr)代替,但这不是本文的重点。总结一下pimpl方式的优点:非常适合隐藏私有实现:如果想暴露头文件中的公共接口,又不想暴露私有实现的细节,可以使用pimpl隐藏细节的模式。pimpl模式,也称为编译防火墙,是一种用来减少编译时间的方法。一般来说,如果头文件中的某些内容发生变化,则意味着所有引用该头文件的代码都必须重新编译,即使变化的是用户类无法访问的私有成员。从多次引用的头文件中去掉这部分代码到只引用编译一次的源文件,改这个文件不会付出太长的编译时间。你怎么认为?参考https://en.cppreference.com/w/cpp/language/pimpl