Почему количество оценок 0? - PullRequest
0 голосов
/ 10 ноября 2019
#include<iostream>
#include<string>
using namespace std;

class Student {
public:
    const int codeStud;
    int noGrades = 0;
    int* grades = NULL;

    Student(int code) :codeStud(code) {
    }

    Student(int code, int* grades, int noGrades) :codeStud(code) {
        this->noGrades = noGrades;
        this->grades = new int[noGrades];
        for (int i = 0; i < noGrades; i++)
            this->grades[i] = grades[i];

    }

    Student(const Student&existent):codeStud(existent.codeStud) {
        this->noGrades = existent.noGrades;
        this->grades = new int[this->noGrades];
        for (int i = 0; i < this->noGrades; i++)
            this->grades[i] = existent.grades[i];
    }

    int getCode() {
        return this->codeStud;
    }

    int getNoGrades() {
        return this->noGrades;
    }

    void setGrades(int grades[],int noGrades) {
        this->noGrades = noGrades;
        this->grades = new int[noGrades];
        for (int i = 0; i < noGrades; i++)
            this->grades[i] = grades[i];
    }
};

void main() {

    Student s1(101);
    cout<<s1.getNoGrades();
    int grades[] = { 10,7,8,10,4 };
    Student s2(104, grades, 5);
    cout << "\n" << s2.getNoGrades();

    Student s3 = s2;
    cout << "\n" << s3.getCode();

    int grades2[] = { 5,5,4,10 };
    s1.setGrades(grades2,4);
    cout << "\n" << s1.getNoGrades(); // here is the problem
}

После того, как я изменил оценки для ученика 1, он показывает, что у него 0 оценок, а на выходе должно быть 4, количество этих оценок: 5,5,4,10. Остальные результаты верны, даже когда я хочу узнать количество оценок для ученика 1, которое равно 0, а затем для ученика 2, которое равно 5.

Ответы [ 2 ]

0 голосов
/ 10 ноября 2019

После того, как я исправил опечатку (codStud -> codeStud), ваш код дал мне правильные результаты. До того, как я это сделал, я не мог даже скомпилировать его, поэтому я предположил бы, что ваша IDE просто запустит последнюю рабочую версию, которая может быть успешно скомпилирована (где-нибудь ищите сообщения об ошибках). Вот почему вы получили неправильный результат, потому что ваши изменения были даже не в этой версии.

Несколько замечаний по поводу вашего кода:

  • В вашем setGrades Проверьте, что grades уже не указывает на что-то. Например, если я вызываю Student(int code, int* grades, int noGrades) и после того, как я вызываю setGrades, ваш код теряет память, поскольку он теряет массив, выделенный Student(int code, int* grades, int noGrades) ранее.

  • Вы должны использовать vector вместо массивов в стиле C. Это сделает ваш код намного чище и менее подверженным ошибкам (см. Мой пример).

  • Вы можете сделать свои функции получения равными const (как в моем примере), так чтобыло бы гарантировано, что эти функции не изменяют значение какого-либо члена класса (вы получите ошибку компиляции, если они это сделают). Кроме этого, вы можете сделать переменные-члены равными private.

Реализация с использованием vector s:

#include <iostream> // cout
#include <vector> // vector

using namespace std;

class Student
{
public:
    Student(const int code)
      : m_code{code}
    {
    }

    Student(const int code, const std::vector<int>& grades)
      : m_code{code},
        m_grades{grades}
    {
    }

    // Default copy constructor is sufficient because the class can be copied
    // memberwise.

    int getCode() const {
        return m_code;
    }

    int getNoGrades() const {
        return m_grades.size();
    }

    void setGrades(const std::vector<int>& grades) {
        m_grades = grades;
    }

private:
    const int m_code;
    std::vector<int> m_grades;
};

int main()
{
    Student s1(101);
    cout << s1.getNoGrades();
    Student s2(104, {10, 7, 8, 10, 4});
    cout << "\n" << s2.getNoGrades();

    Student s3 = s2;
    cout << "\n" << s3.getCode();

    s1.setGrades({5, 5, 4, 10});
    cout << "\n" << s1.getNoGrades();

    return 0;
}
0 голосов
/ 10 ноября 2019

Я изменил некоторые вещи в вашем коде, чтобы скомпилировать его


#include<iostream>
#include<string>
using namespace std;

class Student {
public:
    int codeStud;
    int noGrades = 0;
    int* grades = NULL;

    Student(int code) {
        codeStud = code;
    }

    Student(int code, int* grades, int noGrades) {
        this->noGrades = noGrades;
        this->grades = new int[noGrades];
        for (int i = 0; i < noGrades; i++)
            this->grades[i] = grades[i];

    }

    Student(const Student&existent){
        this->noGrades = existent.noGrades;
        this->grades = new int[this->noGrades];
        for (int i = 0; i < this->noGrades; i++)
            this->grades[i] = existent.grades[i];
    }

    int getCode() {
        return this->codeStud;
    }

    int getNoGrades() {
        return this->noGrades;
    }

    void setGrades(int grades[],int noGrades) {
        this->noGrades = noGrades;
        this->grades = new int[noGrades];
        for (int i = 0; i < noGrades; i++)
            this->grades[i] = grades[i];
    }
};

int main() {

    Student s1(101);
    cout<<s1.getNoGrades();
    int grades[] = { 10,7,8,10,4 };
    Student s2(104, grades, 5);
    cout << "\n" << s2.getNoGrades();

    Student s3 = s2;

    int grades2[] = { 5,5,4,10 };
    s1.setGrades(grades2,4);
    cout << "\n" << s1.getNoGrades(); // here is the problem
}

, и вывод:

0
5
4

что правильно, потому что вы не назначаете количество оценокs1 в любом месте вашего кода перед первой печатью

Также ищите: /187025/chto-dolzhno-vozvraschat-main-v-c-i-c почему void main () не верен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...