Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 14.11.2023
Сообщений: 55

Объединить классы в файлах, показать работу сеттеров и геттеров на выводе, создать массив

26.10.2024, 19:49. Показов 3695. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Представлен код для автошколы с Классами инструктора, студента, Экзаменов и общая структура автошколы
1)нужно объединить классы: чтобы студенту был привязан инструктор и экзамен
2) продемонстрировать работу set и get

основной файл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include"Inst.h"
#include"Student.h"
#include"Exam.h"
#include"School.h"
#include<iostream>
#include<string>
 
using namespace std;
 
int main() {
    setlocale(LC_ALL, "ru");
 
    cout << "=== Ввод данных для класса instructor ===" << endl;
    string instructorName, instructorSpecialty;
    int instructorExperience;
 
    while (true) {
        cout << "Введите имя инструктора: ";
        cin >> instructorName;
        if (isValidName(instructorName)) {
            break; // Имя валидное, выходим из цикла
        }
        else {
            cout << "Ошибка: имя должно содержать только буквы и пробелы. Попробуйте снова." << endl;
        }
    }
 
    // Ввод специальности инструктора с проверкой
    while (true) {
        cout << "Введите специальность инструктора (механика/автомат): ";
        cin >> instructorSpecialty;
        if (isValidName(instructorSpecialty)) {
            break; // Специальность валидная, выходим из цикла
        }
        else {
            cout << "Ошибка: специальность должна содержать только буквы и пробелы. Попробуйте снова." << endl;
        }
    }
 
    do {
        cout << "Введите опыт инструктора (лет): ";
        cin >> instructorExperience;
    } while (!check_input() || instructorExperience < 18);
 
    Instructor* insPtr = new Instructor(instructorName, instructorSpecialty, instructorExperience);
    insPtr->Print();
    delete insPtr;
    cout << endl;
    cout << endl;
 
 
 
 
    cout << "=== Ввод данных для класса Student ===" << endl;
    string studentName;
    int studentAge;
 
    cout << "Введите имя студента: ";
    cin.ignore();
    cin >> studentName;
 
    do {
        cout << "Введите возраст студента: ";
        cin >> studentAge;
    } while (!check_input() || studentAge < 16);
 
    Student* studentPtr = new Student(studentName, studentAge);
    studentPtr->print();
    delete studentPtr;
    cout << endl;
    cout << endl;
 
    cout << "=== Ввод данных для класса Eczamen ===" << endl;
    string eczamenType, eczamenResult, eczamenDate;
 
    cout << "Введите тип экзамена(внутренний/основной): ";
    cin.ignore();
    cin >> eczamenType;
 
    cout << "Введите результат экзамена(сдан/не сдан): ";
    cin >> eczamenResult;
 
    cout << "Введите дату экзамена (дд.мм.гггг): ";
    cin >> eczamenDate;
 
    Eczamen eczamen1(eczamenType, eczamenResult, eczamenDate);
    eczamen1.print();
    cout << endl;
    cout << endl;
 
    cout << "=== Работа с классом structura_shkoli ===" << endl;
    structura_shkoli str(2);
    str.addEczamen(eczamen1);
    str.displayEczamin();
 
    Eczamen eczamen("основной", "сдан", "16.09.2020");
    str.addEczamen(eczamen);
    str.displayEczamin();
    cout << endl;
    cout << endl;
 
    cout << "=== Указатель на компоненту-функцию (Print) ===" << endl;
    Instructor ins3("Артур", "механика", 10);
    void (Instructor:: * funcPtr)() = &Instructor::Print;
    (ins3.*funcPtr)();
    cout << endl;
    cout << endl;
 
    cout << "=== Указатель на экземпляр класса ===" << endl;
    Instructor* insPtr2 = new Instructor("Андрей", "автомат", 8);
    insPtr2->Print();
    delete insPtr2;
 
    return 0;
}
Inst.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#pragma once
 
 
#include<iostream>
#include<string>
using namespace std;
class Instructor {
private:
    string name;
    string specialty;
    int experience;
public:
 
    Instructor() {
        cout << "Конструктор по умолчанию для инструктора" << endl;
        this->name = "";
        this->specialty = "";
        this->experience = 0;
    };
    Instructor(string name, string specialty, int experience) : name(name),
        specialty(specialty), experience(experience) {
        cout << "Вызван конструктор инструктора с 3 параметрами для инструктора" << endl;
    }
    Instructor(const Instructor& other) {
        cout << "конструктор копирования" << endl;
        this->name = other.name;
        this->experience = other.experience;
        this->specialty = other.specialty;
    }
    ~Instructor() {
        cout << "деструктор для инструктора" << endl;
    }
    string getName() { return this->name; }
    void setName(string& n) { this->name = n; }
    string getSpecialty() { return this->specialty; }
    void setSpecialty(string& s) { this->specialty = s; }
    int getExperience() { return this->experience; }
    void setExperience(int e) { this->experience = e; }
    void Print() {
        cout << "name: " << name << " " << "Специальность: " << specialty << " " << "опыт: " << experience << endl;
    }
 
};
Student.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#pragma once
#include<iostream>
#include<string>
using namespace std;
class Student {
    string name;
    int age;
public:
    Student();
    Student(string name, int age);
    Student(Student& other);
    ~Student();
    string getName();
    void setName(string& n);
    int getAge();
    void setAge(int& a);
    void print();
};
School.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#pragma once
#include<iostream>
#include<string>
using namespace std;
class structura_shkoli {
    Eczamen* eczamin;
    int capacity;
    int size;
 
public:
    structura_shkoli(int cap) : capacity(cap), size(0) {
        eczamin = new Eczamen[capacity];
        cout << "вызван конструктор для структуры автошколы" << endl;
    }
    ~structura_shkoli() {
        cout << "вызван деструктор для структуры автошколы" << endl;
 
        delete[] eczamin;
    }
    void addEczamen(const Eczamen& Eczamen) {
        if (size < capacity) {
            eczamin[size++] = Eczamen;
        }
        else {
            cout << "ошибка!" << endl;
        }
    }
    void displayEczamin() {
        for (int i = 0; i < size; i++) {
            eczamin[i].print();
        }
    }
};
 
Student::Student()
{
    cout << "Вызван конструкор по умолчанию" << endl;
    this->name = "";
    this->age = 0;
}
 
Student::Student(string name, int age)
{
    cout << "Вызван констуктор с 2 параметрами " << endl;
    this->age = age;
    this->name = name;
}
 
Student::Student(Student& other)
{
    cout << "Вызван конструктор копирования" << endl;
    this->age = other.age;
    this->name = other.name;
}
 
Student::~Student()
{
    cout << "Деструктор для студента" << endl;
}
 
string Student::getName()
{
    return this->name;
}
 
void Student::setName(string& n)
{
    this->name = n;
}
 
int Student::getAge()
{
    return this->age;
}
 
void Student::setAge(int& a)
{
    this->age = a;
}
 
void Student::print()
{
    cout << "Студент:" << this->age << "лет ,имя: " << this->name << endl;
}
 
 
bool check_input() {
    if (cin.fail()) {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n'); //по-сути дела я говорю игнорируй
        // символы до тех пор, пока не встретишь символ новой строки \n или не прочитаешь максимальное возможное количество символо
        return false;
    }
    return true;
}
bool isValidName(const string& name) {
    for (char c : name) {
        if (!isalpha(c)) {
            return false;
        }
    }
    return true;
}
Exam.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#pragma once
#include<iostream>
#include<string>
using namespace std;
class Eczamen {
private:
    string type;
    string result;
    string date;
 
public:
    Eczamen() : type(""), result(""), date("") {
        cout << "Конструктор по умолчанию для экзамена" << endl;
    }
 
    Eczamen(string type, string result, string date) : type(type), result(result), date(date) {
        cout << "Конструктор для 3 переменных для экзамена" << endl;
    }
 
    Eczamen(const Eczamen& other) : type(other.type), result(other.result), date(other.date) {
        cout << "Констуктор копирования для экзамена" << endl;
    }
 
    ~Eczamen() {
        cout << "деструктор для экзамена" << endl;
    }
 
    string getType() { return type; }
    void setType(string& t) { type = t; }
 
    string getResult() { return result; }
    void setResult(string& r) { result = r; }
 
    string getDate() { return date; }
    void setDate(string& d) { date = d; }
 
 
 
    void print() {
        cout << "Тип экзамена: " << type << " результат: " << result << " дата: " << date << endl;
    }
 
 
    Eczamen& operator=(const Eczamen& other) {
        if (this != &other) {
            type = other.type;
            result = other.result;
            date = other.date;
        }
        return *this;
    }
};
Буду ООЧЕНЬ благодарен, если поможете решить!!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.10.2024, 19:49
Ответы с готовыми решениями:

Аналоги набору геттеров\сеттеров
Доброго времени суток! Итак, вот представим, что у меня есть класс, у него есть некоторые переменные, к которым должен быть доступ из...

Шаблон для сеттеров геттеров
Не подскажите, в стандартной библиотеке(или может в какой другой либе) есть класс вроде template&lt;class T&gt; class Object { ...

Максимальное кол-во Геттеров и Сеттеров
Искал инфу в оф. документациях, но так ничего и не нашел =( Какое максимально количество Геттеров и Сеттером может быть в одном объекте? ...

3
фрилансер
 Аватар для Алексей1153
6465 / 5678 / 1131
Регистрация: 11.10.2019
Сообщений: 15,118
27.10.2024, 08:02
ddsxkx, если инструкторам и экзаменам раздать уникальные идентификаторы, то в студенте можно будет безопасно хранить идентификаторы, а не указатели
0
231 / 172 / 71
Регистрация: 14.06.2024
Сообщений: 468
27.10.2024, 18:37
Цитата Сообщение от ddsxkx Посмотреть сообщение
чтобы студенту был привязан инструктор
с чего бы? он школьная собственность,
а вообще то увязать работу четырех классов + main работа на много часов
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
28.10.2024, 15:13
Лучший ответ Сообщение было отмечено ddsxkx как решение

Решение

Цитата Сообщение от udmurt2024 Посмотреть сообщение
а вообще то увязать работу четырех классов + main работа на много часов
Хз, хз.

Вопрос, что вопрос задан размыто. Нет четкого ТЗ.
Сочинение на вольную тему:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <iostream>
#include <string>
#include <functional>
using string = std::string;
 
class Student{
public:
   Student(const string& name)
      : name{name}{}
   const string& Name() const {return name;} 
private:
   string name;
};
 
class Instructor{
public:
   Instructor(const string& name, const string& specialization)
      : name{name}, spec{specialization}{}
   const string& Name() const {return name;}
   const string& Specialization() const {return spec;} 
private:
   string name, spec;
};
 
template<class T>
class ObjectHolder{
public:
   using Type = T;
   template<class ...Args>
   T& construct(Args ...argsv){
      Node* h = new Node{T(argsv...), head};
      head = h;
      return head->data;
   }
   ~ObjectHolder(){
      Node* h = head;
      while(head){
         h = head->next;
         delete head;
         head = h;
      }
   }
   
   ObjectHolder() = default;
   
   ObjectHolder(const ObjectHolder&) = delete;
   ObjectHolder(ObjectHolder&&) = delete;
   ObjectHolder& operator=(const ObjectHolder&) = delete;
   ObjectHolder& operator=(ObjectHolder&&) = delete;
private:
   struct Node{
      T data;
      Node* next;
   };
   
   Node* head{};
};
 
class StudentExemineList{
public:
   void Add(Student& stud, Instructor& instr){
      Records.push_back(Record(stud, instr));
   }
   size_t Size() const{
      return Records.size();
   }
   void Show(){
      for(auto const& [student, instructor] : Records)
         std::cout << student.get().Name() << " <---> " <<  instructor.get().Name() << std::endl;
   }
private:
   class Record{
   public:
      Record(Student& stud, Instructor& instr)
         : student{stud}, instructor{instr}{}
 
      std::reference_wrapper<Student> student;
      std::reference_wrapper<Instructor> instructor;
   };
   std::vector<Record> Records;
};
 
int main(){
   ObjectHolder<Student> students;
   ObjectHolder<Instructor> instructors;
   
   StudentExemineList exem_list;
   exem_list.Add(students.construct("Ivanov"), instructors.construct("Verevkin", "Delphi"));
   exem_list.Add(students.construct("Petrov"), instructors.construct("Colombo", "Deduction"));
   
   std::cout << exem_list.Size() << std::endl;
   
   exem_list.Show();
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.10.2024, 15:13
Помогаю со студенческими работами здесь

Смысл приватных геттеров и сеттеров
Не понимаю зачем нужны приватные свойства. По сути если глянуть, то get и set нужны дабы не нарушать принципы инкапсуляции, т.е если нам...

Генерирование геттеров и сеттеров анотируя поля
Всем привет! Вот хочу решить таку задачу. В java есть анотации. Можно ли так сделать, чтобы если мы анотируем поле @Getter,@Setter в...

PHP:ZF2:Doctrine добавление геттеров и сеттеров
Предистория проблемы. Изучаю zendframework2. Подключил ORM Doctrine. Создал базу данных с тремя таблицами Article, Category, Comment....

Создать массив указателей на объекты всех трех классов. Для каждого объекта показать работу метода Show и среднего
доделать нужно # include &lt;iostream&gt; using namespace std; class Student { public: char name; int Group; };

Классы (объединить мой класс с проверкой на его работу, убрать гото и добавить конструктор копирования)
Доброго времени суток. Подскажите как обьеденить мой класс с проверкой на его работу, убрать гото(заменить на что-то другое и добавить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru