WebKit中的设计模式:Noncopyable
来源:互联网 发布:东方财富软件ddx 编辑:程序博客网 时间:2024/03/29 18:39
转自:WebKit中的设计模式(一): Noncopyable
WebKit作为一款优秀的浏览器,其中有着非常优秀的设计,值得我们借鉴。本文的目的就是剖析WebKit中值得借鉴的设计模式,了解其设计思想,以达到能为我们使用的目的。关于设计模式,推荐阅读经典书籍<<设计模式-可复用面向对象软件的基础>>。本文所分析的设计模式,并非全部都是书上所提及的设计模式。因为设计模式是一个非常泛的概念,只要能够重复使用且能解决特定问题的设计,应该都可以算作设计模式,希望朋友们不要较真。
言归正传,首先我们来分析以下WebKit中Noncopyable的使用。在阅读WebKit的源码过程中,发现很多类都继承了Noncopyable类。我们来看看Noncopyable的定义:
namespace WTFNoncopyable {
class Noncopyable {
Noncopyable(const Noncopyable&);
Noncopyable& operator=(const Noncopyable&);
protected:
Noncopyable() { }
~Noncopyable() { }
};
} // namespace WTFNoncopyable
using WTFNoncopyable::Noncopyable;
Noncopyable类非常简单,就是将拷贝构造函数和=操作符定义成私有。这样做的目的是什么呢?
我们知道,如果我们没有为类定义拷贝构造函数和赋值操作f符,编译器会自动为我们提供拷贝构造函数和赋值操作符。所以下面的代码可以正常工作:
class A {
int a;
};
int main(int argc, char* argv[])
{
A x;
A xx(a);
A xxx = a;
}
问题在于,编译器提供的拷贝构造函数只是进行"浅"拷贝,考虑下面的代码会碰到什么问题?
class A {
char *a;
public:
A{ a = (char*)malloc(10);}
~A{free(a);
};
int main(int argc, char* argv[])
{
A x;
A xx(a);
}
因为x和xx的a字段指针指向同一个地址,这样对象销毁是,存在两次释放同一指针的问题。如何避免这种问题呢,一种方法是加上说明,提醒类的使用者本类不能进行拷贝构造和赋值操作,这显然不是一个好的解决方法,另外一种方法是禁止访问它的拷贝构造函数和赋值操作符(可以将拷贝构造函数和赋值操作符方法设为私有或保护)。WebKit中给出了一个更好的解决方法,就是定义Noncopyable基类,从Noncopyable类派生的类缺省不能进行拷贝构造和赋值操作。但也并非完全禁止拷贝构造和赋值操作,只要我们显示的提供拷贝构造函数和赋值操作,对象还是可以进行拷贝构造和赋值操作,但这是在我们的控制之下。
在其它库中我们也可以看到这样的设计,比如boost库也定义了一个boost::noncopyable类。
- WebKit中的设计模式:Noncopyable
- WebKit中的设计模式(一): Noncopyable
- WebKit中的设计模式(一): Noncopyable
- WebKit中的设计模式(三)策略模式
- webkit 中的设计模式--单例模式
- webkit 中的设计模式--工厂模式
- WebKit中的设计模式(一),开篇
- WebKit中的设计模式(二),单例模式
- WebKit中的设计模式(四)简单工厂模式
- webkit中的设计模式 -- Façade 外观模式
- [转]boost 中的noncopyable
- [转]boost 中的noncopyable
- boost 中的 noncopyable
- boost中的noncopyable
- noncopyable
- noncopyable
- 设计模式中的设计原则
- 设计模式中的代理模式
- 如何查看SQL Server的事务日志
- cxGrid使用汇总1
- 指针专题
- 兴起解的一道题
- cxGrid使用汇总2
- WebKit中的设计模式:Noncopyable
- C/C++内存分布
- 动漫基地平台简介
- 如何删除autorun.inf文件和文件夹
- 联通 SIGP 手机短信接口标准
- cxGrid使用汇总3
- JQuery Ajax三级联动地区下拉框
- onmousemove时提示信息
- Include/winnt.h(8320) : error C2059: syntax error : ')'