标签:style blog class code java tar
上一篇文档,PIMPL(一)
有多种方式实现PIMPL,这里按照《Effective C++》中介绍的方式。
假设原有Person如下:
Person.h
struct Person { public: Person(const int _age); void print(); private: int age; };
Person.cc
Person::Person(const int _age) : age(_age) {} void Person::print() { std::cout << "Person::print::age=" << age << std::endl; }
PersonImpl.h
struct PersonImpl { public: PersonImpl(const int _age); void print(); private: int age; };
PersonImpl.cc
PersonImpl::PersonImpl(const int _age) : age(_age) {} void PersonImpl::print() { std::cout << "PersonImpl::print::age=" << age << std::endl; }
将PersonImpl中的public和protected方法成Person。Person中的方法实际调用的是PersonImpl中对应的方法,Person的定义中需要使用PersonImpl,在Person.h文件中绝对不能#include “PersonImpl.h”,这样就是做无用功了。
因为Person类的定义中需要知道该类的大小,如果直接使用PersonImpl的对象,那么就必须知道PersonImpl的定义,而我们恰恰希望在Person的定义中隐藏PersonImpl的定义。这时候,指针就大显神通了。因为指针的大小只与操作系统的位数有关(32位的机器都占4个字节,64位的机器都占8个字节),所以我们可以使用指针指向PersonImpl,从而只需要前置声明就可以了。这就是暗度陈仓吧。
Person.h
struct PersonImpl; // 前置声明,PIMPL的关键 struct Person { public: Person(const int _age); void print(); private: std::shared_ptr<PersonImpl> pImpl; // 指针,暗度陈仓 };
Person.cc
struct PersonImpl; // 前置声明,PIMPL的关键 struct Person { public: Person(const int _age); void print(); private: std::shared_ptr<PersonImpl> pImpl; // 指针,暗度陈仓 };
在其它地方我们就可以使用Person了,例如:
int main() { Person p(1); p.print(); return 0; }
如《Effective C++》中所说:
标签:style blog class code java tar
原文地址:http://www.cnblogs.com/lovers/p/pimpl2.html