依然是对more effective c++条款30-Proxy Class的学习笔记。
#include
using namespace std;
template
class Array
{
public:
class Proxy
{
public:
Proxy(Array& array, int index)
: theArray(array), itemIndex(index)
{}
Proxy& operator = (const T& rhs)
{
theArray.array[itemIndex] = rhs;
return *this;
}
operator T() const
{
return theArray.array[itemIndex];
}
friend ostream& operator<< (ostream& os, const Proxy& rhs)
{
os << rhs.theArray[rhs.itemIndex];
return os;
}
private:
Array& theArray;
int itemIndex;
};
const Proxy operator[](int index) const;
Proxy operator[](int index);
friend class Proxy;
Array(int dim);
~Array();
private:
T* array;
};
template
Array
::Array(int dim)
{
array = new T[dim];
}
template
Array
::~Array()
{
delete [] array;
}
template
Array
::Proxy Array
::operator[](int index)
{
return Proxy(*this, index);
}
template
const Array
::Proxy Array
::operator [] (int index) const
{
return Proxy(const_cast(*this), index);
}
class Rational
{
public:
Rational(int numerator = 0, int denominator = 1);
int numerator() const;
int denominator() const;
Rational& operator= (const Rational& rhs);
friend ostream& operator<<(ostream& os, const Rational& rhs);
public:
int num;
int deno;
};
Rational::Rational(int numerator, int denominator)
: num(numerator), deno(denominator)
{
std::cout << "Rational Construct" << std::endl;
}
int Rational::numerator() const
{
std::cout << "numerator: " << num <
return 0;
}
int Rational::denominator() const
{
std::cout << "denominator: " << deno << std::endl;
return 0;
}
Rational& Rational::operator = (const Rational& rhs)
{
num = rhs.num;
deno = rhs.deno;
return *this;
}
ostream& operator<<(ostream& os, const Rational& rhs)
{
os << rhs.num << " " << rhs.deno;
return os;
}
int main()
{
Array
a(5);
a[1].numerator(); //
错误
}
之所以出现错误的原因是:operator[] 返回一个代理对象而不是实际的Rational对象。但成员函数numerator()和denominator()只存在于Rational对象上,而不是其代理对象。
但是我想,为什么编译器在这里不调用隐式转换函数
operator T() const
{
return theArray.array[itemIndex];
}
呢?如果调用了,那么错误也就应该不会出现了
一个简单的解决办法是
int main()
{
Array
a(5);
(( Rational ) a[1] ).numerator();
}