zoukankan      html  css  js  c++  java
  • pimpl示例代码

    • 使用pimpl将实现细节移出头文件。

    • 将私有成员变量和私有方法移入Impl类,可以实现数据和方法的封装,以避免在公开头文件中声明私有方法。

    • 不能在实现类中隐藏虚方法(virtual method),虚方法必须在公开类中出现以便由继承类重载。

    • 可以在实现类中加入指向公开类的指针,以便于Impl类调用公开方法。或者也可以将公开类传给需要它的实现类方法。

    • 与Bridge Pattern的区别:The Bridge pattern is about object-oriented design, while the PIMPL idiom is about physical design of files.

    • 解释:

      But in its basic and common form, a class using PIMPL points to a single implementation, so there is no abstract class with distinct subclasses — just one class, forward declared, and compiled elsewhere. Changing the implementation class does not require any recompilation of sources that include the main header.

      For example, say you have a lot of private member functions, private enums, and private data. And these private "bits" change fairly frequently as the class is developed and maintained. If the #include dependencies are such that touching this header file causes a large number of sources to be recompiled, you have a good candidate for PIMPL.

    • 部署pimpl的方法:Making Pimpl Easy

    • 相关书籍:Large-Scale C++ Software Design

    AutoTimer.h


    #include <boost/shared_ptr.hpp>
    
    class AutoTimer
    {
    
    public:
    	/// Create a new timer object with a human readable name
    	 AutoTimer(const std::string &name);
    	/// On destruction, the timer reports how long it was alive
    	~AutoTimer();
    
    private:
    	// Make this object be noncopyable because it holds a pointer
    	AutoTimer(const AutoTimer &);
    	const AutoTimer &operator =(const AutoTimer &);
    	
    	class Impl;
    	boost::shared_ptr<Impl> mImpl;
    
    };
    

    AutoTimer.cpp


    #include "StdAfx.h"
    #include "AutoTimer.h"
    #include <iostream>
    #include <windows.h>
    #include <string>
    
    class AutoTimer::Impl
    {
    public:
    	double GetElapsed() const
    	{
    		return (GetTickCount()-mStartTime) / 1e3;
    	}
    	std::string mName;
    	DWORD mStartTime;
    };
    
    
    AutoTimer::AutoTimer(const std::string &name)
    : mImpl(new AutoTimer::Impl())
    {
    	mImpl->mName = name;
    	mImpl->mStartTime = GetTickCount();
    }
    
    AutoTimer::~AutoTimer(void)
    {
     	std::cout<<mImpl->mName<< ": took " << mImpl->GetElapsed()
     		<< " secs" << std::endl;
    }
    
    

    Main.cpp


    #include "stdafx.h"
    #include "AutoTimer.h"
    #include <iostream>
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	AutoTimer timer("MyTimer");
    
    
    	for (int i = 0; i < 10000; ++i)
    	{
    		cout << ".";
    	}
    	cout << endl;
    	return 0;
    }
  • 相关阅读:
    刷题篇--热题HOT 71-80
    刷题篇--热题HOT 61-70
    双飞翼布局介绍-始于淘宝UED
    css布局——百度前端技术学院
    CSS多列布局Multi-column、伸缩布局Flexbox、网格布局Grid详解
    CSS之BFC详解
    深入理解BFC和Margin Collapse
    CSS 布局_如何实现容器中每一行的子容器数量随着浏览器宽度的变化而变化?
    3列、2列自适应布局,中部内容优先显示3列布局等方法
    三列布局,中间自适应
  • 原文地址:https://www.cnblogs.com/lilun/p/2430702.html
Copyright © 2011-2022 走看看