在模板数组的类中使用下标运算符

时间:2015-12-23 12:59:25

标签: c++ operator-overloading operator-keyword

..
..
..

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)。

1 个答案:

答案 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的必要性。这就是isizesunsigned以避免额外检查会更好的原因。即使您保留签名类型,优化程序也应该修复额外检查的明显低效率。但额外的检查仍然使源代码混乱而忘记它(正如你所做的那样)仍然是一个容易犯的错误。因此,使用int表示从不正确为负的值是不好的做法。