如何使用 C++ 在方法 decleration 中 return 数组?

How to return an array in method decleration using C++?

我正在尝试编写适合面向对象编程的 C++ 代码。

我有两个class,即StudentCourse。在 Student class 中,我有 quiz_scores 这是一个包含 4 个整数的一维数组。我需要 set 和 get 方法,两者都以自然通用的方式使用。

在下面,我实现了setQuizScores方法:

void Student :: setQuizScores(int* quizscores){
   for(int i = 0; i<4; i++){
      quiz_scores[i] = quizscores[i];
   }

其中 quizscores 是我的私人成员。

现在,接下来我想 return getQuizScores 中的这个 quiz_scores 数组用于 Student class 的每个学生。

然而,问题是 C++ 不允许我们直接 return 数组。相反,我希望我的代码结构如下:

int Student :: getQuizScores(){
   Do something;
   return the elements of quiz_scores;
}

我怎样才能有效地做到这一点?

我不想使用标准模板库 (STL),因此我需要创建自己的数组并根据上面的说明访问它们。

正如 setQuizScores() 可以接受一个指向数组的指针,getQuizScores() return 也可以接受一个指向 quiz_scores 成员数组的指针,例如:

const int* Student::getQuizScores() const {
   // do something...
   return quiz_scores;
}

然后调用者可以根据需要访问数组元素,例如:

Student s;
...
const int *scores = s.getQuizScores();
for(int i = 0; i < 4; ++i){
   cout << scores[i] << ' ';
}

或者,由于数组是固定大小的,您可以 return 对数组的引用,例如:

typedef int scoresArr[4];
scoresArr quiz_scores;

...

const scoresArr& Student::getQuizScores() const {
   // do something...
   return quiz_scores;
}
Student s;
...
const scoresArr &scores = s.getQuizScores();
for(int i = 0; i < 4; ++i){
   cout << scores[i] << ' ';
}

有几种方法可以return一个数组:

传入数组复制到

void Student::getQuizScores(int* out) {
    for(int i = 0; i < 4; i++)
        out[i] = quiz_scores[i];
}

Student student;
int scores[4];
student.getQuizScores(scores);
// use scores[0], etc...

return 包含数组的结构

struct Scores {
    int values[4];
};

Scores Student::getQuizScores() {
    Scores s;
    for(int i = 0; i < 4; i++)
        s.values[i] = quiz_scores[i];
    return s;
}

Student student;
Scores s = student.getQuizScores();
// use s.values[0], etc...

return class

中对 quiz_scores 数组的引用
using Scores = int[4];

Scores const& Student::getQuizScores() const {
    return quiz_scores;
}

Student student;
Scores const& scores = student.getQuizScores();
// use scores[0], etc...

您可以通过 getQuizScores 方法 return 指向 quiz_scores 数组的指针,如下所示:

版本 1:使用尾随 return 类型

auto getQuizScores() -> int(*)[4]
    {
       //Do something;
       return &quiz_scores;//NOTE THE & INFRONT OF quiz_scores
    }

现在您可以使用这个 returned 指针来初始化其他数组。一个可能的例子是:

#include <iostream>
struct Student
{
    int quiz_scores[4]= {1,2,3,4};
    //getQuizScores returns a pointer to an array of size 4 with element of type int
    auto getQuizScores() -> int(*)[4]
    {
       //Do something;
       return &quiz_scores;//NOTE THE & INFRONT OF quiz_scores
    }
    void setQuizScores(int* quizscores)
    {
       for(int i = 0; i<4; i++)
       {
       quiz_scores[i] = quizscores[i];
       }
    }
    
};

int main()
{
    Student s;
    
    int arr[4];
    
    for(int i = 0; i< 4; ++i)
    {
        arr[i] = (*s.getQuizScores())[i];
        std::cout<<arr[i]<<std::endl;
    }
    
    return 0;
}

版本 2:不使用尾随 return 类型

int (*getQuizScores())[4]
{
   //Do something;
   return &quiz_scores;//NOTE THE & INFRONT OF quiz_scores
}

版本 2 与版本 1 相同,只是这次 getQuizScores 方法不使用试用 return 类型。

还有其他可能性,例如 return 对 quiz_scores 数组的引用。