首页 > 解决方案 > 如何检查调用了哪种类型的下标运算符,左值还是右值?

问题描述

我写了一个 Vector 包装类。我想为这个类重载下标运算符。

如果用户想要将值设置为大于大小的索引。我将向量大小调整为 index*2。

但是,如果用户想从大于大小的索引中获取值。我会抛出一个异常。

那么,如何在重载的运算符方法中检查这两种情况呢?

矢量.h:

#include <iostream>
#include <vector>

using namespace std;

template <class T>
class Vector {
  vector<T> v;
  public:
    T& operator[] (const int index);
    T getmax ();
    int add (T val);
    int size();
    int capacity();
};

向量.cpp

#include "Vector.h"


template <class T>
T Vector<T>::getmax (){
  T retval;
  return retval;
}


template <class T>
T& Vector<T>::operator[] (const int index){
    //How to check that which is called =>  v[5]=10(setting) or cout<<v[5]/getting)?
    if(index>v.size()-1){  
        v.resize(index*2); 
        return v[index];
    }
    else{
        return v[index];
    }
}


template <class T>
int Vector<T>::add (T val){ //return index
    v.push_back(val);
}


template <class T>
int Vector<T>::size (){
    return v.size();
}

template <class T>
int Vector<T>::capacity (){
    return v.capacity();
}

主文件

#include "Vector.cpp"
#include <iostream>


int main () {
  Vector<int> myobject;

  myobject.add(67);
  myobject[2]=99;

  cout <<"myobject[0]:"<<myobject[0]<<endl;
  cout <<"myobject[1]:"<<myobject[1]<<endl;
  cout <<"myobject[2]:"<<myobject[2]<<endl;
  cout <<"myobject[3]:"<<myobject[3]<<endl;

  return 0;
}

标签: c++operator-overloadingstdvector

解决方案


您可以重载operator []forconst和非const对象。

T& operator[] (const int index);
T const& operator[] (const int index) const;

但是,如果您有一个非const对象,即使您的意图是获取而不是设置,也会调用第一个重载。如果你想在getset之间实现不同的行为,最好有两个这样的函数。

T const& get(int index) const;
void set(int index, T const&);

推荐阅读