从下标运算符重载中返回一个数组
Posted
技术标签:
【中文标题】从下标运算符重载中返回一个数组【英文标题】:return an array from subscripting operator overload 【发布时间】:2021-10-23 10:26:43 【问题描述】:我开始使用 c++,我有这个方法,我重载下标运算符“[]”,但我需要从该方法返回一个数组,在该方法中,我试图从一个更大的数组,但我似乎无法返回整个数组,因为我只能从数组中返回一个元素,我怎样才能获得返回整个数组的方法?
例如:
int& PagedArray::operator [] (int position)
if(position == 0)
for(int i = 0; i < 256; i++)
pageArray[i] = completeArray[i];
//cout << to_string(i) + " " + to_string(pageArray[i]) << endl;
return pageArray[0] ;
当我尝试返回时,我只能从数组 pageArray 中获取特定元素,但我需要返回 pageArray,我该如何完成?
谢谢
【问题讨论】:
从使用 C 样式数组切换到std::vector
。 std::vector
可以按值返回。
@PaulSanders 或const&
,这可能是您想要的。
无关:position != 0
时返回什么?
@ChrisMM 应该在终端中显示消息“index out bounds”,但显然代码还没有完成,但我只是想先解决这个错误,所以我可以继续处理其余的问题
如果数组在编译时是固定长度的,可以返回一个引用,然后使用[]
语法访问它的元素(假设数组只要引用就存在给它)。如果长度未知(例如,动态分配的数组,其长度在运行时确定),则有必要返回一个代理(例如,对包含/管理数组的对象的引用,并提供提供对元素的访问的operator[]()
。使用std::vector
是(除其他外)第二种方法的一个示例
【参考方案1】:
我需要从那个方法返回一个数组
int& PagedArray::operator [] (int position)
您为函数提供的返回类型与您需要返回的类型不匹配。这个函数返回一个整数的引用;不是数组。
你需要的一个问题是你不能在 C++ 中返回一个数组;这在语言中是不允许的。也就是说,返回类型不能是数组。但是,有一种相当简单的方法可以解决这个问题:您可以返回类的实例,并且可以将数组存储为类的成员。标准库中有此类数组包装类的模板。它叫做std::array
。
这里是一个返回子数组的例子:
constexpr std::size_t page_size = 256;
std::array<int, page_size>
PagedArray::operator[] (int)
std::array<int, page_size> page;
std::copy(completeArray, page);
return page;
鉴于您最初尝试返回引用,您可能正在寻找一种方法来避免使用间接复制子数组。一个问题是子数组在调用函数之前不存在任何地方,并且您无法返回对您在函数中创建的内容的引用。
您可以返回指向大数组的子范围,而不是返回对小数组的引用。标准库中实际上有不止一个选项。有一个通用的std::ranges::subrange
和std::span
,专门针对连续范围。我建议使用更具体的类型,假设您没有对大容器的类型进行模板化。示例:
std::span<int, page_size>
PagedArray::operator[] (int)
return completeArray, page_size;
【讨论】:
以上是关于从下标运算符重载中返回一个数组的主要内容,如果未能解决你的问题,请参考以下文章
重载运算与类型转换——基本概念,输入和输出运算符,算术和关系运算符,赋值运算符,下标运算符,递增和递减运算符,成员访问运算符