c – pimpl成语如何减少依赖性?
作者:互联网
考虑以下:
PImpl.hpp
class Impl;
class PImpl
{
Impl* pimpl;
PImpl() : pimpl(new Impl) { }
~PImpl() { delete pimpl; }
void DoSomething();
};
PImpl.cpp
#include "PImpl.hpp"
#include "Impl.hpp"
void PImpl::DoSomething() { pimpl->DoSomething(); }
Impl.hpp
class Impl
{
int data;
public:
void DoSomething() {}
}
client.cpp
#include "Pimpl.hpp"
int main()
{
PImpl unitUnderTest;
unitUnderTest.DoSomething();
}
这种模式背后的想法是Impl的界面可以改变,但客户端不必重新编译.然而,我没有看到这是如何真实的情况.假设我想在这个类中添加一个方法 – 客户端仍然需要重新编译.
基本上,我认为需要更改类的头文件的唯一类型的更改是类的接口更改的内容.当发生这种情况时,pimpl或没有pimpl,客户端必须重新编译.
这里的哪种编辑在不重新编译客户端代码方面给我们带来了好处?
解决方法:
主要优点是接口的客户端不必强制包含所有类的内部依赖项的标头.因此,对这些标题的任何更改都不会级联到大多数项目的重新编译中.加上关于实现隐藏的一般理想主义.
此外,您不一定会将您的impl类放在自己的标头中.只需将它作为单个cpp中的结构,并使外部类直接引用其数据成员.
编辑:示例
SomeClass.h
struct SomeClassImpl;
class SomeClass {
SomeClassImpl * pImpl;
public:
SomeClass();
~SomeClass();
int DoSomething();
};
SomeClass.cpp
#include "SomeClass.h"
#include "OtherClass.h"
#include <vector>
struct SomeClassImpl {
int foo;
std::vector<OtherClass> otherClassVec; //users of SomeClass don't need to know anything about OtherClass, or include its header.
};
SomeClass::SomeClass() { pImpl = new SomeClassImpl; }
SomeClass::~SomeClass() { delete pImpl; }
int SomeClass::DoSomething() {
pImpl->otherClassVec.push_back(0);
return pImpl->otherClassVec.size();
}
标签:pimpl-idiom,c 来源: https://codeday.me/bug/20190929/1829976.html