more effective c++ Item M4 书上写的代理类实现不了,需要修改一下哟
2012-06-05 20:43
239 查看
more effective c++ Item M4
书上原文如下
这里把 ArraySize 嵌套入 Array 中,为了强调它总是与 Array 一起使用。你也必须声明ArraySize 为公有,为了让任何人都能使用它。 想一下,当通过单参数构造函数定义 Array 对象,会发生什么样的事情:
Array<int> a(10);
你的编译器要求用 int 参数调用 Array<int>里的构造函数,但是没有这样的构造函数。编译器意识到它能从 int 参数转换成一个临时 ArraySize 对象,ArraySize 对象只是Array<int>构造函数所需要的,这样编译器进行了转换。函数调用(及其后的对象建立)也就成功了。
请注意,如果构造函数Array(ArraySize size)函数体为空,编译器GCC4.5.2会提示:
undefined reference to `Array<int>::Array(Array<int>::ArraySize)'|
||=== Build finished: 1 errors, 0 warnings ===|
书上原文如下
class Array { public: class ArraySize { // 这个类是新的 public: ArraySize(int numElements): theSize(numElements) {} int size() const { return theSize; } private: int theSize; }; Array(int lowBound, int highBound); Array(ArraySize size); // 注意新的声明 ... };
这里把 ArraySize 嵌套入 Array 中,为了强调它总是与 Array 一起使用。你也必须声明ArraySize 为公有,为了让任何人都能使用它。 想一下,当通过单参数构造函数定义 Array 对象,会发生什么样的事情:
Array<int> a(10);
你的编译器要求用 int 参数调用 Array<int>里的构造函数,但是没有这样的构造函数。编译器意识到它能从 int 参数转换成一个临时 ArraySize 对象,ArraySize 对象只是Array<int>构造函数所需要的,这样编译器进行了转换。函数调用(及其后的对象建立)也就成功了。
#include <iostream> using namespace std; template <typename T> class Array { public: class ArraySize { // 这个类是新的 public: ArraySize(int numElements): theSize(numElements) {} int size() const { return theSize; } private: int theSize; }; Array(int lowBound, int highBound); Array(ArraySize size){} // 注意新的声明 /*{ cout << "Constructed" << endl; }*/ }; int main() { Array<int> a(10); return 0; }
请注意,如果构造函数Array(ArraySize size)函数体为空,编译器GCC4.5.2会提示:
undefined reference to `Array<int>::Array(Array<int>::ArraySize)'|
||=== Build finished: 1 errors, 0 warnings ===|
相关文章推荐
- kindeditor本身支持上传flash功能,但是我们经常需要上传一些flv、mp4或则其它格式的视频。 其实具体的播放功能是通过jwplayer实现的。我只对kindeditor简单的修改了一下
- ASP.NET中实现二级或多级域名(修改UrlRewrite)需要注意的问题 (转)
- vue 实现 点击取消监控内容是否发生修改 若修改提示 是否需要保存
- ASP.NET中实现二级或多级域名(修改UrlRewrite)需要注意的问题
- 对C++沉思录中代理类实现的质疑和修改
- shiro实现不同浏览器本修改密码时其余浏览器需要重新登录
- 修改bootstrap 中 CSS 样式表,以实现自己需要的部分样式。
- 带省市区信息修改功能,需要先把省市区原数据select下拉显示,JQuery实现
- 如果修改了表结构的话,可能也需要将调用到表的存储过程、函数等也修改一下,以下语句可以查询到那些对象调用到被修改的表
- 注册表修改之后,是不会生效的,需要重启,或者执行如下操作(但是有些按这样操作也还是不能立即生效,最保险的方式还是通过重启电脑来实现)
- ASP.NET中实现二级或多级域名(修改UrlRewrite)需要注意的问题
- 从windows修改文件,拖到linux上,注意时间,可能需要touch一下保证可编译!
- java实现阶乘的计算,抛出异常不会,怎么使用标号跳转,需要帮解决一下
- 有时候也需要偷懒一下 -- GridView 自带分页实现
- web页面上 实现 “点击复制”, 只需要一行代码, 记录一下这个npm包
- 创建一个学生系统,实现一下功能; * 1:增加学生 * 2:显示学生 * 3:修改学生 * 4:删除学生 * 5:查找学生 * 6:退出程序 * 请输入选择(
- 有时候也需要偷懒一下 –GridView 自带分页实现(超级简单)
- 小激动一下,实现修改feature属性(enterprise版本即可)。
- 实现图片的轮播效果,自己写的。。可以做一下修改
- C++实现线程同步的几种方式 线程同步是指同一进程中的多个线程互相协调工作从而达到一致性。之所以需要线程同步,是因为多个线程同时对一个数据对象进行修改操作时,可能会对数据造成破坏,下面是多