C++ :学习Proxy Class之笔记2
2004-09-01 16:30
501 查看
依然是对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 < 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();
}
#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 < 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();
}
相关文章推荐
- 设计模式C++学习笔记之二(Proxy代理模式)
- 设计模式C++学习笔记之二(Proxy代理模式)
- 设计模式C++学习笔记之二(Proxy代理模式)
- 设计模式C++学习笔记之二(Proxy代理模式)
- 设计模式C++学习笔记之二(Proxy代理模式)
- 设计模式C++学习笔记之九(Proxy代理模式)
- C++学习笔记56——类模板中的class与typename
- 设计模式C++学习笔记之二(Proxy代理模式)
- 学习笔记——c++自定义class用于unordered
- 设计模式C++学习笔记之二(Proxy代理模式)
- 设计模式C++学习笔记之二(Proxy代理模式)
- Modern C++ Design 学习笔记之Policy Based Class Design
- 设计模式C++学习笔记之二(Proxy代理模式)
- Modern C++ Design 学习笔记之Policy Based Class Design
- 设计模式C++学习笔记之二(Proxy代理模式)
- 设计模式C++学习笔记之二(Proxy代理模式)
- 设计模式C++学习笔记之二(Proxy代理模式)
- 设计模式C++学习笔记之二(Proxy代理模式)
- 设计模式C++学习笔记之二(Proxy代理模式)
- C++学习笔记(字符串string、vector_deque、queue,multiset、map、multimap、容器拷贝问题)