gpt4 book ai didi

c++ - 如何重载子索引运算符以在获取项目和设置项目时表现不同?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:19 27 4
gpt4 key购买 nike

假设我有这个愚蠢的类

class C {
char _data[8];
public :
char getItem(const int index) const {return _data[index-1];}
void setItem(const int index){_data[index+1] = 1;}
};

正如它所示,这个类支持两种不同的行为。

  1. 当我“得到”第 n 个项目时,它将返回 _data[n-1]
  2. 但是当我“设置”第 n 个项目时,它会设置 _data[n+1]

问题是,我可以重载 operator[] 来支持上面的这两种行为吗?

最佳答案

您可以让 operator[] 返回一个重载 operator= 的代理类来设置值并转换为 char 来获取值:

#include <iostream>

class C {
public:
char _data[8];

class Proxy {
friend class C;
C* instance;
int index;
Proxy(C* p, int i) : instance(p), index(i) {}
public:
Proxy& operator=(char c)
{
instance->_data[index+1] = c;
return *this;
}
operator char()
{
return instance->_data[index-1];
}
};

public :
C() = default;
Proxy operator[](int index) { return Proxy(this, index); }
};

int main()
{
C c;
c[0] = 42;
std::cout << int(c[2]);
}

输出为 42

这确实有点傻。您可能还想使 Proxy 不可复制。此外,const 正确性变得更加棘手,因为在 const 对象 C 和实际更改它的类之间存在一个间接层。

关于c++ - 如何重载子索引运算符以在获取项目和设置项目时表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22636552/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com