Как вы используете и передаете аргументы в функцию, которая использует переменные и списки, объявленные в классе в c ++? - PullRequest
0 голосов
/ 25 апреля 2020

Хорошо, я знаю, как использовать java классы, но есть кое-что о классах c ++, которые я не получаю. Мой профессор хочет, чтобы мы могли добавить название класса, который посещает студент, и его оценку в стандартный список записей, который есть в классе студента, а затем в других функциях проследить и распечатать информацию. Я знаю, как использовать структуры и функции и даже классы из других языков, но как мне объявить и затем использовать их в c ++? В настоящее время я создал то, что у меня ниже, из базовой модели c, которую он нам дал, но, например, я добавил список и заголовок в функцию замедления функции printRecords () в ученике класса, но я не знаю, правильно ли я это делаю. который. и как мне действительно передать список в функцию, или в моей функции addClass () фактически добавить информацию в список? Я не добавил список и заголовок в определение функции addClass (), и я просто пытаюсь использовать его по имени списка st_records, и он не выдает никаких ошибок при его создании, но это кажется странным для меня, поскольку он указан в частном в замедлении класса ... это потому, что он все еще находится в заголовочном файле?

//////// This is my header file copied
#ifndef _BIKES_H_ 
#define _BIKES_H_
#include <fstream>
#include <string>
#include <iostream>
#include <list>

using namespace std;

struct Record 
{ 
    string class_name;
    char grade; 
};

class Student 
{ 
    public:
        Student(string & name); 
        void printRecords(list<Record> & head);
        char gradeForClass(string & cl_name, list<Record>& head);
        string standing(int); 
        void addClass(string &, char); 
    private: 
        int numClassesTaken; 
        string st_name; 
        std::list<Record> st_records; 
};

/*********************** * Student::printRecords() 
* When called from the main(), this function prints the entire Student's record: 
* classes taken along with their grades. 
*/ 
void Student::printRecords(list<Record>& head) 
{ 
    for (auto it = head.begin(); it != head.end(); it++)
    {
        cout << "Class: " << it->class_name << " Grade: " << it->grade;
    }
}
/*********************** 
* Student::standing() 
* When called from the main(), this function should output: 
* "Freshman", "Sophomore", "Junior", "Senior", 
* depending on the number of classes successfully(!) taken. 
* The exact implementation (in the part of 
* how many classes needed to advance to the next level) is up to you. 
* But this function should not iterate over the list of Records, or call std::list's 
* size() to determine the number of classes. You have a variable for that in
* the Student's class. 
* Note that this function returns string by value. 
*/ 
string Student::standing(int num) 
{ 
    int classes = num / 4;
    string ret = "";

    switch (classes)
    {
    case 0: ret = "Freshman"; break;
    case 1: ret = "Sophmore"; break;
    case 2: ret = "Junior"; break;
    case 3: ret = "Senior"; break;
    default: ret = "Not a normal path"; break;
    }
    return ret;
}

/*********************** 
* Student::gradeForClass() 
* Parameter: A class name. 
* Return type: a single character of grade. 
* Behavior: 
* When called from the main(), this function shall find a class by its name 
* in the Student's Records and output the grade for that class. 
* In case there is no such class in the Records, you shall output the value, 
* somehow reflecting that. 
*/ 
char Student::gradeForClass(string & cl_name, list<Record>& head)
{ 
    for (auto it = head.begin(); it != head.end(); it++)
    {
        if (it->class_name.compare(cl_name) == 0)
        {
            return it->grade;
        }
    }
}

/*********************** 
* Student::addClass() 
* When called from the main(), this function creates a new Record and adds that to 
* the list of Student's Records. It also increments the numClassesTaken, 
* which will be used to determine a Student's standing. 
*/ 
void Student::addClass(string & cl_name, char  grade_)
{ 
    Record* r = new Record();
    r->class_name = cl_name;
    r->grade = grade_;

    st_records.push_back(*r);
}
#endif

Ответы [ 2 ]

2 голосов
/ 25 апреля 2020

В C ++, когда у класса есть функция-член, эта функция-член имеет доступ ко всем членам данных этого класса экземпляра, к которому была вызвана функция.

Таким образом, вам не нужно передавать список записей в функции класса, он уже имеет к ней доступ и может ссылаться на него по имени st_records.

public, protected и private определяют доступ, который имеют «другие». Таким образом, public означает, что любой может получить доступ к данным этих классов. protected означает, что он может получить доступ к своим членам, и любые производные классы также могут, private означает, что только он может получить доступ к этим данным. Но все «это» имеет доступ, все его функции.

1 голос
/ 25 апреля 2020

Ваша функция addClass написана так, как если бы она была Java

void Student::addClass(string & cl_name, char  grade_)
{ 
    Record* r = new Record();
    r->class_name = cl_name;
    r->grade = grade_;
    st_records.push_back(*r);
}

Это верно в Java, но утечка памяти в C ++. Вот правильный C ++.

void Student::addClass(const string & cl_name, char grade_)
{ 
    Record r;
    r.class_name = cl_name;
    r.grade = grade_;
    st_records.push_back(r);
}

В C ++ не каждый объект должен быть выделен с new. На самом деле часто считается плохим стилем явно использовать new в C ++.

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

Ваша функция printRecords неверна, но опять-таки правильный код такой же, как и код Java, поэтому я все еще не уверен что это вы не получаете. Вот правильный код

void Student::printRecords() const
{ 
    for (auto it = st_records.begin(); it != st_records.end(); it++)
    {
        cout << "Class: " << it->class_name << " Grade: " << it->grade;
    }
}

Очевидно, что список, который вы хотите напечатать, является списком классов, а не списком, переданным в качестве параметра. Единственный новый аспект этого метода заключается в том, что в C ++ он должен быть объявлен const, поскольку он не изменяет объект.

Я могу только думать, что различия между C ++ и Java ошеломили вас и вы упускаете места, где они одинаковы. Хотя есть много технических отличий, они похожи в том, как они реализуют ориентацию объекта.

...