0

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.

9
  • 1
    since C++ does not allow us to return arrays directly -- Use std:::array<int, 4>, then all of those issues go away. Commented Nov 18, 2021 at 17:05
  • @PaulMcKenzie I prefer not using STL. I should create my own arrays in a standard way. Commented Nov 18, 2021 at 17:16
  • Then put the array into a struct. In opposition to arrays, structs can be returned by value. (Actually, std::array does nothing else.) Commented Nov 18, 2021 at 17:16
  • A note: Return type int and return the elements of quiz_scores; doesn't go well together. Commented Nov 18, 2021 at 17:18
  • 2
    You really should start learning STL, most of C++ is about STL. Not using STL reduces C++ to "C with classes". Using STL is the standard C++ way. Commented Nov 18, 2021 at 17:19

3 Answers 3

3

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... 
Sign up to request clarification or add additional context in comments.

Comments

2

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

Comments

1

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.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.