gpt4 book ai didi

C++ - 根据赋值侧重载 [] 运算符

转载 作者:可可西里 更新时间:2023-11-01 15:39:47 25 4
gpt4 key购买 nike

我正在尝试用 C++ 编写一个动态数组模板

我目前正在重载 [] 运算符,我想根据它们在赋值的哪一侧使用来实现不同的行为。

#include <iostream>
...

template <class T>
T dynamic_array<T>::operator[](int idx) {
return this->array[idx];
}

template <class T>
T& dynamic_array<T>::operator[](int idx) {
return this->array[idx];
}

using namespace std;
int main() {
dynamic_array<int>* temp = new dynamic_array<int>();

// Uses the T& type since we are explicitly
// trying to modify the stored object
(*temp)[0] = 1;

// Uses the T type since nothing in the array
// should be modified outside the array
int& b = (*temp)[0];

// For instance...
b = 4;
cout<<(*temp)[0]; // Should still be 1
return 0;
}

出于显而易见的原因,我在尝试像这样重载时遇到编译器错误。

有没有正确的方法来做到这一点?

到目前为止,我的搜索还没有成功。我所看到的任何重载 [] 运算符似乎都接受用户可以在对象外部修改存储的项目。

我已经实现了使用 (instance(int i), update(int i, T obj)) 的方法,但如果能够像使用常规数组一样使用此类,那就太好了。

最佳答案

你不能只重载返回类型。

提供常量和非常量访问器重载的标准方法是通过 this 的常量来区分:

T       & get()       { return x; }
const T & get() const { return x; } // or T get() const;

对于常量版本,您可以返回常量引用或按值返回,这取决于 T是 - const-reference 可能更普遍有用。

(代替 get() 你会写 operator[](std::size_t i) ,当然。我只是想保持简短。)


我不认为这会 100% 达到您的想法,但那是因为您的推理有误:int b = foo()永远成为对任何事物的引用,即使foo()返回一个(常量或非常量)引用,因为 b声明为 int 类型, 不是 int& .实际上,当你说 int b = (*temp)[0]; 时,你实际上会调用非常量版本。但这实际上不是问题。 (要获得常量版本,您必须说 int b = static_cast<const dynamic_array<int> &>(*temp)[0];(*static_cast<const dynamic_array<int> *>(temp))[0] - 但何必呢。)

关于C++ - 根据赋值侧重载 [] 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7410559/

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