如何在 class 中重载 C++ 中的 [] 运算符

How to overload the [] operator in c++ in a class

在我的 class 中,我们正在经历 C++ 中的运算符重载。我正在研究我们的练习题之一,以帮助我们学习重载和使用友元函数的基础知识。这是第一个要求我重载我的教授没有提供的运算符的问题。提示是写一个函数可以通过cout << Sam[int] << endl;访问Marksclass里面的testScores。我相信这样做的方法是重载 [] 运算符以输出 testScores[int] 但我可能不正确。我正在尝试编写重载函数,但我收到一个错误,指出 operator[] 必须是一个成员函数,据我所知。我不是 100% 确定我实现重载函数的方式是否有效,但无论如何我都无法测试它,直到我发现我做错了什么 visual studio 看不到我将它作为成员包含在内.

这是class:

#pragma once
#include<iostream>
using namespace std;
class Marks
{
private:
    int testScores[3];
public:
    Marks();
    Marks(int, int, int);
    friend int& operator[](int, Marks&);///here it says operator[] must be a member function
};

下面是我尝试实现重载函数的方式:

int& operator[](int index, Marks& p) {
    int temp;
    temp = p.testScores[index];//I cannot access testScores because it says operator[] isn't a member of Marks. 


    return temp;
}

上述实施可能无法正常工作,但我现在显然遇到了除此之外的问题。

这是实际提示要求我做的: 在下面的class object 实例化中, class Markes 和 header 的写法是通过下面的方式来输出Sam的私有变量tesctScores[3]。

使用此提供的 int 主代码:

int main(){
Marks Sam(99, 100, 89);
cout<<Sam[0]<<endl;
cout<<Sam[1]<<endl;
cout<<Sam[2]<<endl;
}

是否无法重载 [] 而我应该尝试重载 << ?我认为那里的超载会导致 endl; 出现问题。任何人关于为什么 visual studio 没有检测到我的重载函数是 class Marks 的成员的意见?

Operator Overloading

a[b] (a).operator[](b) cannot be non-member

所以编译器说你 operator[] 必须是一个成员函数是绝对正确的。您需要在 class.

中重载 operator[]
class Marks
{
private:
    int testScores[3];
public:
    Marks();
    Marks(int, int, int);
    int& operator[](std::size_t idx);
};

int& Marks::operator[](std::size_t idx) {
  return testScores[idx];
}