return 来自下标运算符重载的数组

return an array from subscripting operator overload

我刚开始使用 C++,我有这个方法,我重载了下标运算符“[]”,但我需要 return 来自该方法的数组,在该方法中,我正在尝试到 return 来自更大数组的子数组,但我似乎无法 return 整个数组,因为我只能 return 来自数组的单个元素,我如何获得该方法到 return 整个数组?

例如:

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] ;
    }
}

当我尝试 return 时,我只能从数组 pageArray 中获取特定元素,但我需要 return pageArray,我该如何完成?

谢谢

I need to return an array from that method

int& PagedArray::operator [] (int position)

您为函数提供的 return 类型与您需要 return 的类型不匹配。这个函数 returns 是一个整数的引用;不是数组。

你需要的一个问题是你不能在 C++ 中 return 一个数组;这在语言中是不允许的。也就是说,return类型不能是数组。然而,有一种相当简单的方法可以解决这个问题:您可以 classes 的 return 个实例,并且可以将数组存储为 class 的成员。标准库中有一个用于此类数组包装器 class 的模板。它被称为 std::array

这里是一个 return 子数组的例子:

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;
}

鉴于您最初尝试 return 引用,您可能正在寻找一种方法来避免使用间接复制子数组。一个问题是子数组在调用该函数之前不存在于任何地方,并且您不能 return 对您在函数中创建的内容的引用。

您可以 return 指向大数组的子范围,而不是 return 对小数组的引用。标准库中实际上有不止一种选择。有一个通用的 std::ranges::subrange 和特定于连续范围的 std::span 。我建议使用更具体的类型,假设您没有对大容器的类型进行模板化。示例:

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