什么是拷贝构造函数,什么时候要用,什么时候需要禁止
http://blog.csdn.net/arssqz/article/details/6361986
为什么要禁止,怎样禁止拷贝构造函数
http://jrdodds.blogs.com/blog/2004/04/disallowing_cop.html
http://c2.com/cgi/wiki?YouArentGonnaNeedIt
编译器存在哪些陷阱
http://www.cnblogs.com/yfanqiu/archive/2012/05/08/2489905.html
Google和Qt的的宏的区别
http://stackoverflow.com/questions/1454407/macros-to-disallow-class-copy-and-assignment-google-vs-qt
典型的Google宏的写法
http://src.chromium.org/svn/trunk/src/third_party/cld/base/macros.h
// A macro to disallow the copy constructor and operator= functions // This should be used in the private: declarations for a class // // For disallowing only assign or copy, write the code directly, but declare // the intend in a comment, for example: // void operator=(const TypeName&); // DISALLOW_ASSIGN // Note, that most uses of DISALLOW_ASSIGN and DISALLOW_COPY are broken // semantically, one should either use disallow both or neither. Try to // avoid these in new code. #define DISALLOW_COPY_AND_ASSIGN(TypeName) \ TypeName(const TypeName&); \ void operator=(const TypeName&)
主要记录自己碰到的一个问题,编译器显示:
AbstractClass.h:20:12: cannot declare parameter ‘<anonymous>’ to be of abstract type ‘AbstractClass’
其实对于一个比较有经验的人或者理论知识扎实的人,看到这行信息就应该想象到是出现了类似这样的错误
void im_an_error_method(AbstractClass ) { ac.im(); }
参数没有变量名,参数类型是一个抽象类(无法实例化)
可惜我无法确定,因为这个头文件不是我写的,没有足够的证据去指出别人错误的地方。
所以我只能尝试检查自己的代码,结果发现错误的行数是他头文件的
DISALLOW_COPY_AND_ASSIGN(AbstractClass);
这样一行,很奇怪,按道理应该这么写是不应该出错的,因为大家都是这么写的。
于是我尝试将这行注释掉,或者将这行以代码的形式手动展开编译,即这样
AbstractClass(const AbstractClass&); void operator=(const AbstractClass&);
发现也可以编译通过
想想到这里应该可以看明白为什么编译器错误提示当中有个’anonymous’错误了吧。
最终原因定位在macro有写错,所以在极端情况下就出编译错误了。
最后借用http://www.artima.com/cppsource/bigtwo.html的一个例子来回顾下
class Example { SomeResource* p_; public: Example() : p_(new SomeResource()) {} ~Example() { delete p_; } };
这例子有错误吗?有几处错误?