从下标运算符重载中返回一个数组

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::vectorstd::vector 可以按值返回。 @PaulSanders 或const&amp;,这可能是您想要的。 无关: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::subrangestd::span,专门针对连续范围。我建议使用更具体的类型,假设您没有对大容器的类型进行模板化。示例:

std::span<int, page_size>
PagedArray::operator[] (int)
    return completeArray, page_size;

【讨论】:

以上是关于从下标运算符重载中返回一个数组的主要内容,如果未能解决你的问题,请参考以下文章

对下标运算符[]和函数调用运算符()的重载

下标运算符重载

带下标运算符的重载赋值运算符

重载运算与类型转换——基本概念,输入和输出运算符,算术和关系运算符,赋值运算符,下标运算符,递增和递减运算符,成员访问运算符

C++中赋值运算操作符和=重载有啥区别?

c++中为啥赋值运算符重载返回类型是引用