【问题标题】:How to return an array in method decleration using C++?如何使用 C++ 在方法声明中返回数组?
【发布时间】:2021-12-29 13:56:36
【问题描述】:

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

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

下面我实现setQuizScores方法:

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

quizscores 是我的私人会员。

现在,接下来我想在 getQuizScores 中为 Student 班级的每个学生返回这个 quiz_scores 数组。

但是,问题在于 C++ 不允许我们直接返回数组。相反,我希望我的代码结构如下:

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

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

我不喜欢使用标准模板库(STL),所以我需要创建自己的数组并按照上面的解释访问它们。

【问题讨论】:

  • 因为 C++ 不允许我们直接返回数组 -- 使用std:::array&lt;int, 4&gt;,那么所有这些问题都消失了。
  • @PaulMcKenzie 我不喜欢使用 STL。我应该以标准方式创建自己的数组。
  • 然后将数组放入struct。与数组相反,structs 可以按值返回。 (实际上,std::array 什么也没做。)
  • 注意:返回类型int返回quiz_scores的元素;并不能很好地结合在一起。
  • 你真的应该开始学习STL,C++中的大部分关于STL的。不使用 STL 将 C++ 简化为“C with classes”。使用 STL标准的 C++ 方式。

标签: c++ arrays oop


【解决方案1】:

正如setQuizScores() 能够获取指向数组的指针一样,getQuizScores() 也可以返回指向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] << ' ';
}

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

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

【讨论】:

    【解决方案2】:

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

    传入要复制到的数组

    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...
    

    返回一个包含数组的结构

    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...
    

    返回对类中 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...
    

    【讨论】:

      【解决方案3】:

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

      版本 1:使用尾随返回类型

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

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

      #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:不使用尾随返回类型

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多