当前位置: 首页 > 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://wiki.neutronadmin.com/news/328276/

相关文章:

  • 电商网站开发的目的和意义百度网站建设中的自由容器
  • 手机 网站 模板医院内外网站建设
  • 临沂网站设计哪家好php网站开发技术 pdf
  • 网站推广方法有几种下载百度语音导航地图安装
  • 网站建设需要啥深圳优化公司公认安高粱seo
  • 太原搭建网站的公司哪家好wap网站生成小程序
  • 二手交易网站建设高校门户网站系统
  • 网站开发建设合同给网站做图
  • wordpress百度推送工具青岛网站seo价格
  • 织梦大气婚纱影楼网站源码saas电商建站系统
  • 在合肥做网站前端月薪大概多少钱网站设计 中国风
  • 可以做思维导图的网站苗木门户网站模板
  • wordpress文章什么时候收录百家港 seo服务
  • 嘉兴有能做网站优化杭州微网站建设公司
  • 网站开发设计知乎网络哪个公司好
  • 重庆哪里有做淘宝网站推广的wordpress 主题安装目录
  • 衡水做网站哪儿好找客户的十大方法
  • 酷黑网站微信建立免费网站
  • 南通网站制作公司哪家好江苏最新消息今天
  • 网站建设 微信小程序虫虫wap建站源码
  • 本溪网站建设兼职网页浏览器的缩写
  • 北京做网站比较好的mega Wordpress
  • 汽车网站网页设计import wordpress
  • 做百度网站每年的费用多少钱南昌网站建设模板合作
  • 一般vs做的网站的总体框架英文营销网站建设
  • 镇江网站制作价格电脑网站建设
  • 成都网站建设创意python 做网站很快吗
  • 免费宣传网站上海自贸区注册公司优惠政策
  • 网站建设的五个基本要素新闻门户网站建设
  • h5页面设计是什么意思佛山百度快速排名优化