C ++:重载下标运算符

时间:2013-06-01 22:56:46

标签: operator-overloading subscript

我正在实现一个向量,所以我希望它表现为一个数组。这就是我试图实现下标运算符但我没有达到正确行为的原因。

实施是这样的:

template <typename value_type>
class Vector{ 
    private:
    value_type ** vector ; 
    long size ; 
    long usedSize ; 

    public: 
    /.../ 
    value_type & operator [] (long) ; // For writing.
    const value_type & operator [] (long) const ; // For reading.
    /.../
}

template<typename value_type> 
value_type & Vector<value_type>::operator[] ( long index ) {
    if ( index < 0 || index > usedSize ) 
        return out_of_range () ; 
    else {
        vector[index] = new value_type () ; 
        usedSize++ ; 
        return *(vector[index]) ;
    }
} 

template<typename value_type> 
const value_type & Vector<value_type>::operator[] ( long index ) const {
    if ( index < 0 || index > usedSize ) 
        return out_of_range () ; 
    else { return (*vector[index]) ; }
}

然后用这个来测试对象的行为:

int main (void) { 
    Vector<int> * v = new Vector ( 10 ) ; // Creates a vector of 10 elements.
    (*v)[0] = 3 ; 
    int a = (*v)[0] ; 
    cout << "a = " << a << endl ;
}

我从执行中得到了这个:

$> a = 0 

有些线程建议使用处理程序类重载赋值运算符,我想知道是否还有避免使用处理程序对象来执行任务。

提前致谢。

来自阿根廷的Gonzalo。

1 个答案:

答案 0 :(得分:1)

假设在行

,你错了
  

cout&lt;&lt; “a =”&lt;&lt; (* v)[0]&lt;&lt; ENDL;

  

const value_type&amp; Vector :: operator [](长索引)const

将被使用。

实际上两次

  

value_type&amp;矢量::操作符[]

用于使用new(和同时泄漏的内存)“替换”以前的值

下面的

应该有帮助

value_type & Vector<value_type>::operator[] ( long index ) {
    if ( index < 0 || index > usedSize )
        ///out of bounds handling
    else {
        if(vector[index]== 0)
        {
            vector[index] = new value_type () ;
            usedSize++ ;
        }
        return *(vector[index]) ;
    }
}