1

我想要一个具有两个数组下标运算符重载的类:一个用于读取,另一个用于写入。

目的是保持变化。我读到(在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;
};

但这在我的情况下不起作用。我正在使用带有 -std=c++11 的 g++ 4.7,实际上只有“正在写作”打印在屏幕上,即使我这样做:

Array<int> a;
a[0] = 3;
cout << a[0] << endl;

我还注意到,后者永远不会通过使用 gcov 检查源来调用。该页面上的方法是完全错误的,还是我误解了?

提前致谢。

4

2 回答 2

5

constthis仅当is时才调用重载const。不确定是“读”还是“写”操作。

于 2012-05-28T17:46:06.700 回答
2

这只是一个粗略的想法,我还没有考虑所有的含义,但是具有重载赋值和强制转换运算符的代理类可以解决您的问题:

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) constvoid put(int index, const T& value)

于 2012-05-28T18:05:50.200 回答