返回对结构的引用

Returning reference to struct

本文关键字:引用 结构 返回      更新时间:2023-10-16

使用重载[]运算符,我们可以在容器内设置元素的值。例如

class Example{
public:
  Example(){
     arr = new int[10];
  }
  int operator [] ( unsigned int i) const{
        return arr[i];
  }
  int & operator [] ( unsigned int i){
        return arr[i];
  }
private:
  int *arr[];
}

所以使用

Example a;
a[0] = 0;
a[1] = 1;
a[2] = 2;

我们可以设置元素的值。是否可以用结构做这样的事情?如果我们没有 int 数组,而是结构向量。例如

 struct Test{
       int value;
       int index;
       Test( int a , int b){
          value = a;
          index = b;
       }
 }
 class Example{
 public:
       Example(){
       }
       int operator [] ( unsigned int i) const{
          return a[i].value;
       }
       Test & operator [] ( unsigned int i){
          Test a(0, i );
          one.push_back(a);
          return a -> value;
       }
private:
       vector<Test> a;
        }
Example a;
    a[0] = 0;
    a[1] = 1;
    a[2] = 2;

如何更改返回结构的 value 属性,就像使用典型的 int 容器更改/设置值一样?

是的,这是可能的。

代码有一个错误:return a -> value;返回一个 int,而函数operator[](unsigned int i)表示它将返回对 Test 的引用。您可以改为返回one[one.length()-1],以便您可以说example[0]->value = 1;,其中example属于Example类型?

语句 example[0] 是对 operator[](unsigned int i) 的调用,它返回对 one[0] 的引用,其类型是对 Test 的引用。

定义operator[]返回 int 并按照上面的方式实现它是完全有效的。但这非常不直观;我肯定会发现它非常令人困惑,因为运算符 [] 通常返回容器的元素,而不是容器元素的字段。最好定义一个单独的函数,并为其定义一个不言自明的名称,例如int& getValue(unsigned int);用于value字段,int& getIndex(unsigned int)用于index字段。

#include <vector>
using namespace std;
struct Test {
    int value;
    int index;
    Test(int a, int b) {
        value = a;
        index = b;
    }
};
class Example {
public:
    Example() {}
    int operator [] (unsigned int i) const {
        return _a[i].value;
    }
    int & operator [] (unsigned int i) {
        Test a(0, i);
        _a.push_back(a);
        return _a[i].value;
    }
private:
    vector<Test> _a;
};
int main() {
    Example a;
    a[0] = 0;
    a[1] = 1;
    a[2] = 2;
    return 0;
}