我正在实现一个向量,所以我希望它表现为一个数组。这就是我试图实现下标运算符但我没有达到正确行为的原因。
实施是这样的:
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。
答案 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]) ;
}
}