【问题标题】:Two array subscript overloading to read and write两个数组下标重载读写
【发布时间】:2012-06-03 01:14:09
【问题描述】:

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

主要是保持变化的计数器。我读到(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 检查源来调用。 该页面上的方法完全错误,还是我误解了?

提前致谢。

【问题讨论】:

    标签: c++ arrays class operator-overloading setter


    【解决方案1】:

    const 重载仅在 thisconst 时调用。不确定是“读”还是“写”操作。

    【讨论】:

    • 那是我的第一个任务。我过去已经使用过 const 方法,但从该页面阅读让我相信这是一种特殊的语法......
    【解决方案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&amp; get(int index)const T&amp; get(int index) constvoid put(int index, const T&amp; value)

    【讨论】:

    • 嗯,很丑...但是(没有测试)可能会起作用。只是徘徊这会增加多少开销。我真的不想避免 get & set,因为我正在实现 std::vector 的替代方案。
    • 这绝对有效,但有一些调整。但是我必须添加“bool CountingProxy::operator ==(const T &compare) const”才能使其与 gtest 一起使用。奇怪的是,我可以在不实现 operator> 的情况下执行“bool a = array[0] > 3”。 gtest 只需要 operator==。你能想到为什么吗?
    • 在一个不错的编译器上,这应该会增加最少的开销。 array[0] &gt; 3 有效,因为 CountingProxy&lt;T&gt; 可以隐式转换为 T,这要归功于重载的强制转换运算符。
    • 这是预期的行为。但是没有 operator==??也许它使用了一些特殊的比较方法??
    • “不起作用”是什么意思?不会编译?如果是这样,有什么编译器错误?如果不是,运行时行为是否与您的预期不同?
    猜你喜欢
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 2013-03-03
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多