两个数组下标超载读写(Two array subscript overloading to read

2019-09-17 13:34发布

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

该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的源调用。 该网页上的方法完全错误的,或者什么我误解?

提前致谢。

Answer 1:

这只是一个粗略的想法,我还没有想过各方面的影响,但与重载的赋值,并投运营商的代理类可以解决你的问题:

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)



Answer 2:

const如果重载只叫thisconst 。 这不是它是否是一个“读”或“写”操作来决定。



文章来源: Two array subscript overloading to read and write