当前位置: 首页 > news >正文

网站空间名词解释建设银行网站的机构

网站空间名词解释,建设银行网站的机构,网站如何做入支付接口,网站500错误是什么意思pimpl pointer to implementation#xff1a;指向实现的指针#xff0c;使用该技巧可以避免在头文件暴露私有细节#xff0c;可以促进API接口和实现保持完全分离。 Pimpl可以将类的数据成员定义为指向某个已经声明过的类型的指针#xff0c;这里的类型仅仅作为名字引入指向实现的指针使用该技巧可以避免在头文件暴露私有细节可以促进API接口和实现保持完全分离。 Pimpl可以将类的数据成员定义为指向某个已经声明过的类型的指针这里的类型仅仅作为名字引入并没有完整地定义因此我们可以将该类型的定义隐藏在.cpp中这被称为不透明指针。 下面是一个自动定时器的API会在被销毁时打印其生存时间。 原有api // autotimer.h #ifdef _WIN32 #include windows.h #else #include sys/time.h #endif#include stringclass AutoTimer { public:// 使用易于理解的名字创建新定时器explicit AutoTimer(const std::string name); // xplicit避免隐式构造, 只能通过显示(explicit)构造.// 在销毁时定时器报告生存时间~AutoTimer(); private:// 返回对象已经存在了多久double GetElapsed() const;std::string mName; #ifdef _WIN32DWORD mStartTime; #elsestruct timeval mStartTime; #endif }; 这个API的设计包含如下几个缺点 1、包含了与平台相关的定义 2、暴露了定时器在不同平台上存储的底层细节 3、将私有成员声明在公有头文件中。这是C要求的 设计者真正的目的是将所有的私有成员隐藏在.cpp文件中这样我们可以使用Pimpl惯用法了。 将所有的私有成员放置在一个实现类中这个类在头文件中前置声明在.cpp中定义下面是效果 autotimer.h // autotimer.h #include string.h class AutoTimer { public:explicit AutoTimer(const std::string name);~AutoTimer(); private:class Impl;Impl* mImpl; };构造函数需要分配AutoTimer::Impl类型变量并在析构函数中销毁。 所有私有成员必须通过mImpl指针访问。 autotimer.cpp // autotimer.cpp #include autotimer.h #include iostream #if _WIN32 #include windows.h #else #include sys/time.h #endifclass AutoTimer::Impl { public:double GetElapsed() const{ #ifdef _WIN32return (GetTickCount() - mStartTime) / 1e3; #elsestruct timeval end_time;gettimeofday(end_time, NULL);double t1 mStartTime.tv_usec / 1e6 mStartTime.tv_sec;double t2 end_time.tv_usec / 1e6 end_time.tv_sec;return t2 - t1; #endif}std::string mName; #ifdef _WIN32DWORD mStartTime; #elsestruct timeval mStartTime; #endif };AutoTimer::AutoTimer(const std::string name) : mImpl(new AutoTimer::Impl()) {mImpl-mName name; #ifdef _WIN32mImpl-mStartTime GetTickCount(); #elsegettimeofday(mImpl-mStartTime, NULL); #endif }AutoTimer::~AutoTimer() {std::cout mImpl-mName :took mImpl-GetElapsed() secs std::endl;delete mImpl;mImpl NULL; }Impl的定义包含了暴露在原有头文件中的所有私有方法和变量。 AutoTimer的构造函数分配了一个新的AutoTimer::Impl对象并初始化其成员而析构函数负责销毁该对象。 Impl类为AutoTimer的私有内嵌类如果想让.cpp文件中的其他类或者自由函数访问Impl的话可以将其声明为共有的类。 // autotimer.h #include string.h class AutoTimer { public:explicit AutoTimer(const std::string name);~AutoTimer();class Impl; private:Impl* mImpl; };如何规划Impl类中的逻辑 一般将所有的私有成员和私有方法放置在Impl类中可以避免再公有头文件中声明私有方法。 注意事项 不能在Impl类中隐藏私有虚函数虚函数必须出现在公有类中从而保证任何派生类都能重写他们 pimpl的复制语义 在c中如果没有给类显式定义复制构造函数和赋值操作符C编译器默认会创建但是这种默认的函数只能执行对象的浅复制这不利于类中有指针成员的类。 如果客户复制了对象则两个对象指针将指向同一个Impl对象两个对象可能在析构函数中尝试删除同一个对象两次从而导致崩溃。 下面提供了两个解决思路 1、禁止复制类可以将对象声明为不可复制 2、显式定义复制语义 #include string class AutoTimer { public:explicit AutoTimer(const std::string name);~AutoTimer(); private:AutoTimer(const AutoTimer);const AutoTimer operator(const AutoTimer);class Impl;Impl* mImpl; }智能指针优化Pimpl 借助智能指针优化对象删除这里采用共享指针or作用域指针。由于作用域指针定义为不可复制的所以直接使用它还可以省掉声明私有复制构造和操作符的代码。 #include string class AutoTimer { public:explicit AutoTimer(const std::string name);~AutoTimer(); private:class Impl;boost::scoped_ptrImpl mImpl;// 如果使用shared_ptr就需要自己编写复制构造和操作符 }Pimpl优缺点总结 优点 1、信息隐藏 2、降低耦合 3、加速编译实现文件移入.cpp降低了api的引用层次直接影响编译时间 4、二进制兼容性任何对于成员变量的修改对于Pimpl对象指针的大小总是不变 5、惰性分配mImpl类可以在需要时再构造 缺点 1、增加了Impl类的分配和释放可能会引入性能冲突。 2、访问所有私有成员都需要在外部套一层mImpl→这会使得代码变得复杂。
http://www.yutouwan.com/news/328276/

相关文章:

  • 黑龙江建筑职业技术学院招生网站做网站 用 显示器
  • 做甜品网站栏目建设工程标准 免费下载网站
  • 儿童故事网站建设网站建设色系搭配
  • 网站制作代理平台小游戏网站建设
  • iis 网站打不开企业网站页面
  • 东莞市公司网站建设怎么样网页qq登陆保护
  • 计算机网站开发工作证学校校园网站
  • 转转怎么做钓鱼网站施工企业主要负责人包括
  • 简单网站开发实例网页版微信怎么加好友
  • 目前做那些网站致富apache 安装 wordpress
  • 福州企业网站制作wordpress添加表
  • 重庆企业模板建站信息wordpress插件放那个文件夹
  • 做网站优化两年遇到的SEO常态桔子建站官网
  • 网站首页打开速度洛阳做网站哪家专业
  • 做非法网站判刑多少年asp.net网站开发案例教程
  • 广州市企业网站制作个人备案做公司网站
  • 溧阳网站建设价格wordpress 调用文章简介
  • 免费自助建站软件网络空间搜索引擎
  • 网站搭建步骤原创文章代写平台
  • 岳阳公司网站开发服务器如何架设网站
  • 无站点推广就是不在网上推广专做美妆的视频网站
  • 技术专业网站建设wordpress屏蔽谷歌字体
  • 网站正在建设中备案燕郊 网站开发
  • html5移动端手机网站开发流程图卖水果做哪个网站好
  • 宜宾网站开发招聘有哪些做分析图用的网站
  • 阿里巴巴网站怎样做的漂亮wordpress加载latex慢
  • 网站建设优化去哪学网站右下角广告展示代码
  • 辽宁省建设工程招标投标协会网站wordpress用什么写的
  • 昆明云南微网站搭建网页微信登录不了
  • 泰安网站建设个人工作室校网站建设方案