..
..
..
const int sizes = 50;
template<class T>
class List {
private:
int curSize;
T arr[sizes];
public:
List<T>(){
cout << "constructor called\n";
this->curSize = 0;
}
void add(T element) {
arr[curSize] = element;
this->curSize++;
}
..
..
..
T operator[](int i){
if( i > sizes ){
cout << "Index out of bounds" << endl;
return arr[0];
}
return arr[i];
}
当我调用add函数时,运算符重载对我来说不起作用,只有当我尝试从main.cpp访问它时才有效。 我如何在课堂内访问操作员? 我在这里搜索,发现了一个对我没有用的灵魂(* this)。
答案 0 :(得分:1)
您使用(*this)
找到的解决方案是正确的,但您的operator[]
返回了错误的类型,因此没有正确的方法来使用它。将回复率从T
更改为T&
:
T& operator[](int i){
if( i > sizes || i<0 ){
cout << "Index out of bounds" << endl;
return arr[0];
}
return arr[i];
}
然后你可以在课堂上使用它:
(*this)[curSize] = element;
你还应该有一个const版本:
T const& operator[](int i) const {
if( i > sizes || i<0 ){
cout << "Index out of bounds" << endl;
return arr[0];
}
return arr[i];
}
编码const和非const版本(以避免重复代码)的另一种方法是使用const_cast
委托给另一个版本。
另请注意检查i<0
的必要性。这就是i
和sizes
为unsigned
以避免额外检查会更好的原因。即使您保留签名类型,优化程序也应该修复额外检查的明显低效率。但额外的检查仍然使源代码混乱而忘记它(正如你所做的那样)仍然是一个容易犯的错误。因此,使用int
表示从不正确为负的值是不好的做法。