Home > Enterprise >  How to return an array in method decleration using C ?
How to return an array in method decleration using C ?

Time:11-19

I am trying to write C code suitable for object oriented programming.

I have two classes, namely, Student and Course. In the Student class, I have quiz_scores which is a 1-D array of 4 integers. I need both set and get methods, both are used in natural common way.

In the following, I implement setQuizScores method:

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

Where quizscores are my private members.

Now, next thing is that I want to return this quiz_scores array in the getQuizScores for each students of Student class.

However, the problem is that C does not allow us to return arrays directly. Instead, I want the structure of my code as following:

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

How can I do that efficiently?

I prefer not to use the Standard Template Library (STL), so I need to create my own arrays and access them according to the explanation above.

CodePudding user response:

There are a few ways how you could return an array:

Pass in an array to copy to

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 a struct containing the array

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 a reference to the quiz_scores array inside the class

using Scores = int[4];

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

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

CodePudding user response:

Just as setQuizScores() is able to take a pointer to an array, so too can getQuizScores() return a pointer to the quiz_scores member array, eg:

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

The caller can then access the array elements as needed, eg:

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

Alternatively, since the array is fixed size, you can return a reference to the array instead, eg:

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

CodePudding user response:

You can return a pointer to the quiz_scores array through getQuizScores method as shown below:

Version 1: Using trailing return type

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

Now you can use this returned pointer to initialize other arrays. One possible example would be:

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

Version 2: Without using trailing return type

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

Version 2 is the same as version 1 except that this time the getQuizScores method does not uses trialing return type.

There are other possibilities also like returning a reference to the quiz_scores array.

  • Related