我想有两个数组下标运算符重载类:一个用于读取,而另一个用于书写。
该pourpose是保持变化的计数器。 我读了(在http://faculty.cs.niu.edu/~mcmahon/CS241/c241man/node97.html ),我可以做这样的事情:
template<typename T>
class Array
{
public:
Array()
{
data = new T[100];
}
T &operator[] (int index)
{
cout << "Is writing\n";
changes++;
return data[index];
}
T operator[] (int index) const
{
cout << "Is reading\n";
return data[index];
}
private:
T *data;
int changes;
};
但是,这并不在我的情况下工作。 我使用的是G ++ 4.7与-std = C ++ 11和实际上只有“正在写”被印在屏幕上,即使我这样做:
Array<int> a;
a[0] = 3;
cout << a[0] << endl;
我还注意到,后者从来没有通过检查与gcov的源调用。 该网页上的方法完全错误的,或者什么我误解?
提前致谢。
这只是一个粗略的想法,我还没有想过各方面的影响,但与重载的赋值,并投运营商的代理类可以解决你的问题:
template<typename T>
class CountingProxy
{
public:
CountingProxy(int& counter, T& ref) : counter_(counter), ref_(ref)
{
}
CountingProxy<T>& operator=(const T& o)
{
cout << "Is writing\n";
counter_++;
ref_ = o;
return *this;
}
operator T()
{
cout << "Is reading\n";
return ref_;
}
private:
int& counter_;
T& ref_;
};
template<typename T>
class Array
{
public:
Array()
{
data = new T[100];
}
CountingProxy<T> operator[] (int index)
{
return CountingProxy<T>(changes, data[index]);
}
T operator[] (int index) const
{
cout << "Is reading\n";
return data[index];
}
private:
T *data;
int changes;
};
在另一方面,你可能会通过实现不同的功能与您的阵列的读取和写入的元素,比如更好T& get(int index)
, const T& get(int index) const
和void put(int index, const T& value)
。
const
如果重载只叫this
是const
。 这不是它是否是一个“读”或“写”操作来决定。