【问题标题】: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 是(除其他外)第二种方法的一个示例

标签: c++ arrays overloading operator-keyword subscript


【解决方案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};
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 2013-06-01
    • 2015-09-14
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多