Bridge模式/ Pimpl惯用法 实例
2014-02-22 12:45
302 查看
函数对象(仿函数)实现多态
方法:
1- 把仿函数类的数据和/或多态移到另一个类中。
2-然后给你的仿函数一个指向这个新类的指针。
例子:函数对象中的虚函数会出现分割问题(因为STL的函数对象作为参数/返回值时是通过值传递的)
template<typenameT>
class BPFC: // BPFC =“Big Polymorphic
public // FunctorClass”
unary_function<T,void> {
private:
Widget w; // 这个类有很多数据,
Int x; // 所以用值传递
... // 会影响效率
public:
virtual voidoperator()(const T& val) const; // 这是一个虚函数,
... // 所以切割时会出问题
改为桥接模式实现:
1,[b]把所有数据和虚函数放到实现类[/b]
[b]2,[b]建立一个包含一个指向实现类的指针的小而单态的类[/b][/b]
template<typename T> // 用于修改的BPFC
class BPFCImpl
public unary_function<T, void> { // 的新实现类
private:
Widget w; // 以前在BPFC里的所有数据
int x; // 现在在这里
...
virtual ~BPFCImpl(); // 多态类需要
// 虚析构函数
virtual void operator()(const T& val) const;
friend classBPFC<T>; // 让BPFC可以访问这些数据
};
template<typename T>
class BPFC: // 小的,单态版的BPFC
public unary_function<T, void> {
private:
BPFCImpl<T>*pImpl; // 这是BPFC唯一的数据
public:
void operator()(const T& val) const // 现在非虚;
{ // 调用BPFCImpl的
pImpl->operator()(val);
}
...
};
BPFC::operator()的实现例证了BPFC所有的虚函数是怎么实现的:它们调用了在BPFCImpl中它们真的虚函数。
结果是仿函数类(BPFC)是小而单态的,但可以访问大量状态而且行为多态------Bridge模式/Pimpl惯用法(设计模式)
注意:
必须保证BPFC的拷贝构造函数对指向的BPFCImpl对象做了合理的事情;
或者将指向的BPFCImpl对象的指针放入shared_ptr中。
方法:
1- 把仿函数类的数据和/或多态移到另一个类中。
2-然后给你的仿函数一个指向这个新类的指针。
例子:函数对象中的虚函数会出现分割问题(因为STL的函数对象作为参数/返回值时是通过值传递的)
template<typenameT>
class BPFC: // BPFC =“Big Polymorphic
public // FunctorClass”
unary_function<T,void> {
private:
Widget w; // 这个类有很多数据,
Int x; // 所以用值传递
... // 会影响效率
public:
virtual voidoperator()(const T& val) const; // 这是一个虚函数,
... // 所以切割时会出问题
改为桥接模式实现:
1,[b]把所有数据和虚函数放到实现类[/b]
[b]2,[b]建立一个包含一个指向实现类的指针的小而单态的类[/b][/b]
template<typename T> // 用于修改的BPFC
class BPFCImpl
public unary_function<T, void> { // 的新实现类
private:
Widget w; // 以前在BPFC里的所有数据
int x; // 现在在这里
...
virtual ~BPFCImpl(); // 多态类需要
// 虚析构函数
virtual void operator()(const T& val) const;
friend classBPFC<T>; // 让BPFC可以访问这些数据
};
template<typename T>
class BPFC: // 小的,单态版的BPFC
public unary_function<T, void> {
private:
BPFCImpl<T>*pImpl; // 这是BPFC唯一的数据
public:
void operator()(const T& val) const // 现在非虚;
{ // 调用BPFCImpl的
pImpl->operator()(val);
}
...
};
BPFC::operator()的实现例证了BPFC所有的虚函数是怎么实现的:它们调用了在BPFCImpl中它们真的虚函数。
结果是仿函数类(BPFC)是小而单态的,但可以访问大量状态而且行为多态------Bridge模式/Pimpl惯用法(设计模式)
注意:
必须保证BPFC的拷贝构造函数对指向的BPFCImpl对象做了合理的事情;
或者将指向的BPFCImpl对象的指针放入shared_ptr中。
相关文章推荐
- 运动目标检测小结
- android:imeOptions属性
- 行车中软件抢单 6成用户认为不安全
- AD学习笔记之三 -- 域控制器上的简单操作介绍
- 建立专门的数组类处理有关数组的操作+扩展1
- OpenCV图像缩放操作
- Ubuntu中flash player安装的问题
- 移动互联网造浪 赴美上市或创10年新高
- WIN7安装打印机时提示“打印机无法安装,打印处理器不存在”处理方法
- 监管趋严 预警余额宝类基金
- 安卓android中 The connection to adb is down 解决方法,笔者自己解决的经验
- Darwin Streaming Server编译运行过程
- android系统不调用系统界面后台发送彩信的实现
- js-jQuery对象与dom对象相互转换
- jquery loading效果
- android 高效加载大图
- SimpleAdapter使用
- js 数组
- ASP.NET中TimeSpan的介绍
- c++,你好