c++ - 如何检查调用了哪种类型的下标运算符,左值还是右值?
问题描述
我写了一个 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;
}
解决方案
您可以重载operator []
forconst
和非const
对象。
T& operator[] (const int index);
T const& operator[] (const int index) const;
但是,如果您有一个非const
对象,即使您的意图是获取而不是设置,也会调用第一个重载。如果你想在get和set之间实现不同的行为,最好有两个这样的函数。
T const& get(int index) const;
void set(int index, T const&);
推荐阅读
- python - 如何使用 python 在 kafka 消费者中聚合 json 数据?
- amazon-web-services - 有没有办法使用 AWS step 函数中的状态输入来插入 OutputPath 的 JsonPath?
- python - MacOS Catalina 10.15.5 Flask-Mysqldb pip install 报错
- makefile - 带有`ifeq`的Makefile测试特定文件
- azure - az storage account:“blob-service-properties”不在“az storage account”命令组中
- xcode - 简化 Xcode 中的 SwiftUI 预览
- javascript - 我们可以使用 iframe (HTML/JS) / Umap 的元素吗
- sql - 如何自动增加 id 并插入 2 行
- r - 如何将相关性显示为闪亮的数字输出?
- libraries - 如何将 jregex 库导入芭蕾舞女演员应用程序