您的位置:首页 > 编程语言 > C语言/C++

more effective c++ Item M4 书上写的代理类实现不了,需要修改一下哟

2012-06-05 20:43 239 查看
more effective c++ Item M4

书上原文如下

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 ===|
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐