pimpl_sample.h
#if !defined (PIMPL_SAMPLE)
#define PIMPL_SAMPLE
#include <boost/scoped_ptr.hpp>
class pimpl_sample
{
private:
class impl;
// 译者注:原文中这句在class之外,与下文的实现代码有矛盾
boost::scoped_ptr<impl> pimpl_;
public:
pimpl_sample();
~pimpl_sample();
void do_something();
};
#endif
pimpl_sample.cpp
#include "pimpl_sample.h"
#include <string>
#include <iostream>
class pimpl_sample::impl
{
public:
void do_something_()
{
std::cout << s_ << "\n";
}
~impl()
{
s_.clear();
}
std::string s_;
};
pimpl_sample::pimpl_sample() : pimpl_(new impl)
{
pimpl_->s_ = "This is the pimpl idiom";
}
pimpl_sample::~pimpl_sample()
{
}
void pimpl_sample::do_something()
{
pimpl_->do_something_();
}
main.cpp
#include "boost/scoped_ptr.hpp"
#include <string>
#include <iostream>
int main()
{
boost::scoped_ptr<std::string> p(new std::string("Use"));
boost::scoped_ptr<std::string> p1(new std::string("Acts just like a pointer."));
// 打印字符串的值
if (p)
std::cout <<"p : "<< *p << '\n';
std::cout <<"p size: " << p->size() << std::endl;
// 获取字符串的大小
if (p1)
std::cout <<"p1 : "<< *p1 << std::endl;
// 交换
p->swap(*p1);
if (p)
std::cout <<"p : "<< *p << '\n';
// 获取字符串的大小
if (p1)
std::cout <<"p1 : "<< *p1 << std::endl;
size_t i=p->size();
// 给字符串赋新值
// 这里p被销毁,并删除std::string
system("pause");
return 0;
}
Pimpl 方法可以将H文件和cpp文件完全分离,H文件不需要修改函数定义,可以让函数封装更加便捷,让逻辑和底层分离,H文件也不要经常修改。
Pimpl 详情请度娘。