Как вернуть массив при отмене метода с помощью C ?

#c #arrays #oop

Вопрос:

Я пытаюсь написать код на C , подходящий для объектно-ориентированного программирования.

У меня есть два класса, а именно: Student и Course . В Student классе у меня quiz_scores есть 1-й массив из 4 целых чисел. Мне нужны как методы set, так и методы get, оба используются естественным общим способом.

В следующем я реализую setQuizScores метод:

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

Где quizscores мои личные члены.

Теперь, следующее, что я хочу, чтобы вернуть этот quiz_scores массив в getQuizScores для каждого учащегося студенческого класса.

Однако проблема в том, что C не позволяет нам возвращать массивы напрямую. Вместо этого я хочу, чтобы структура моего кода была следующей:

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

Как я могу сделать это эффективно?

Я предпочитаю не использовать Стандартную библиотеку шаблонов (STL), поэтому мне нужно создавать свои собственные массивы и получать к ним доступ в соответствии с приведенным выше объяснением.

Комментарии:

1. поскольку C не позволяет нам возвращать массивы напрямую — Use std:::arraylt;int, 4gt; , все эти проблемы исчезают.

2. @PaulMcKenzie Я предпочитаю не использовать STL. Я должен создавать свои собственные массивы стандартным способом.

3. Затем поместите массив в a struct . В отличие от массивов, struct s может быть возвращено по значению. (На самом деле, std::array больше ничего не делает.)

4. Примечание: Возвращаемый тип int и возвращаемые элементы quiz_scores; не очень хорошо сочетаются друг с другом.

5. Вам действительно следует начать изучать STL, большая часть C посвящена STL. Отказ от использования STL сводит C к «C с классами». Использование STL является стандартным способом C .


Ответ №1:

Есть несколько способов, как вы могли бы вернуть массив:

Передайте массив для копирования в

 void Student::getQuizScores(int* out) {  for(int i = 0; i lt; 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 lt; 4; i  )  s.values[i] = quiz_scores[i];  return s; }  Student student; Scores s = student.getQuizScores(); // use s.values[0], etc...  

возвращает ссылку на массив quiz_sores внутри класса

 using Scores = int[4];  Scores constamp; Student::getQuizScores() const {  return quiz_scores; }  Student student; Scores constamp; scores = student.getQuizScores(); // use scores[0], etc...  

Ответ №2:

Точно так же, как 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 lt; 4;   i){  cout lt;lt; scores[i] lt;lt; ' '; }  

В качестве альтернативы, поскольку массив имеет фиксированный размер, вы можете вместо этого вернуть ссылку на массив, например:

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

Ответ №3:

Вы можете вернуть указатель на quiz_scores массив с помощью getQuizScores метода, как показано ниже:

Версия 1: Использование конечного типа возврата

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

Теперь вы можете использовать этот возвращенный указатель для инициализации других массивов. Одним из возможных примеров может быть:

 #include lt;iostreamgt; 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() -gt; int(*)[4]  {  //Do something;  return amp;quiz_scores;//NOTE THE amp; INFRONT OF quiz_scores  }  void setQuizScores(int* quizscores)  {  for(int i = 0; ilt;4; i  )  {  quiz_scores[i] = quizscores[i];  }  }   };  int main() {  Student s;    int arr[4];    for(int i = 0; ilt; 4;   i)  {  arr[i] = (*s.getQuizScores())[i];  std::coutlt;lt;arr[i]lt;lt;std::endl;  }    return 0; }   

Версия 2: Без использования конечного типа возврата

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

Версия 2 такая же, как и версия 1, за исключением того, что на этот раз getQuizScores метод не использует тип возвращаемого значения для проверки.

Существуют и другие возможности, такие как возврат ссылки на quiz_scores массив.