#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
массив.