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

Как перейти от Структуры к классу

27.03.2023, 15:18. Показов 1192. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Первый семестр университета был ориентирован на работу со структурным типом данных и выглядело это примерно так:
C++
1
2
3
4
5
6
7
8
9
struct Student {
    char* surname;
    char* name;
    char* group;
    int   number;
);
int main() {
    Student* stud = new Student[100];
}
Для обращения к конкретному определённому объекту я использовал такую строку:
C++
1
2
// i - любое число
stud[i].surname;
Сейчас мне надо перейти к классам, допустим есть такой код в "Food.h":
C++
1
2
3
4
5
6
7
8
9
10
#pragma once
class Food {
private:
    int        type;    // Тип изделия
    int        quant;   // Количество изделия
    char*      name;    // Наименование изделия
    double     cost;    // Цена изделия
    double     weight;  // Вес изделия
    static int count;   // Счётчик существующих объектов класса
}
Код из Main.cpp
C++
1
2
3
4
#include "Main.h"
int main() {
 
}
Так вот как мне задать правильно класс и потом каким образом обращаться к нему
В моей голове это выглядит как-то так, но на практике в новоиспечённых руках понятное дело не работает
C++
1
2
3
4
int main() {
    Food* f = new Food[100];  // Например для объявления(Не знаю насколько правильно)
    f[i].name;  // Например для обращения к объекту
}
Даже если это будет в какой-то степени правильно, то сейчас мне надо выделять память через конструктор, и как это реализовать я не понимаю от слова совсем(Выделять память под поля прописанные в привате я имею ввиду, а не под сам класс(Используя конструктор))
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.03.2023, 15:18
Ответы с готовыми решениями:

Как перейти от абсолютного позиционирования к относительному не теряя структуры?
Есть группа объектов, которые должны быть очень точно позиционированы друг относительно друга, их очень много, но в моем примере я заменю...

Передать со структуры данные классу
Написал программу "группа студентов". Всё работает хорошо, но меня смущает тот факт, что в моем классе "группа студентов"...

Помощью цикла просмотреть все элемнты массива структуры, а потом перейти к просмотру следующей
И так дорогие программисты, прошу помощи ибо сам уже не осиливаю. В общем такая тема: мне в цикле нужно посмотреть несколько структур. ...

25
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
27.03.2023, 15:43
Цитата Сообщение от -АнКи- Посмотреть сообщение
и как это реализовать я не понимаю от слова совсем(Выделять память под поля прописанные в привате я имею ввиду, а не под сам класс(Используя конструктор))
А раньше, со структурами, вы как это делали? Покажите.
0
 Аватар для PencilTorch
90 / 60 / 32
Регистрация: 06.08.2020
Сообщений: 220
27.03.2023, 15:52
Структура - это тот же класс, где поля по умолчанию публичные. Это собственный тип данных. Обычно, если это просто объединение каких-то близкородственных данных - создают структуру. Если нужен некий функционал обработки этих полей - удобней класс.
Попробуйте поэтапно понимать. Сначала разобраться с доступом к полям.
Создайте сначала экземпляр класса Food f; Убедитесь, что поля вы не видите. Соответственно нужно, или создавать публичные поля, или делать вспомогательные методы геттеры для их просмотра и сеттеры для установки.

Потом с динамической памятью.
Убедитесь, что не важно какие поля приватные или не очень - память под них выделяется одинаково. Хоть в конструкторе, хоть где-нибудь ещё.
2
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
27.03.2023, 16:05
Лучший ответ Сообщение было отмечено -АнКи- как решение

Решение

struct от class в С++ отличаются только тем, что в struct поля по умолчанию public, а в class поля по умолчанию private.
Всё. Других различий нет. Конструкторы в структурах точно также есть на самом деле.

Соответственно со структурами у вас код
C++
1
stud[i].surname;
компилировался, а с классами - не будет, т.к. теперь поле surname - приватное, доступ вне методов класса к нему запрещён. Тем более, вы явно написали private: в своём классе.

Если вы private: в описании класса замените на public: - то разницы между структурами и классами вообще не заметите.
1
0 / 0 / 0
Регистрация: 21.09.2022
Сообщений: 76
27.03.2023, 16:15  [ТС]
Цитата Сообщение от PencilTorch Посмотреть сообщение
Попробуйте поэтапно понимать.
На самом деле я только благодаря такому способу и закрыл первый семестр на высокий бал, но тут я уже сижу день или два и пытаюсь экспериментировать, делать поэтапно и никак

Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
А раньше, со структурами, вы как это делали? Покажите.
Я могу разве что дать ссылку на гитхаб, ибо у меня с жатыми строками и парсингом строки ушло на это более 500 строк

Добавлено через 1 минуту
Цитата Сообщение от KSergey9 Посмотреть сообщение
Если вы private: в описании класса замените на public: - то разницы между структурами и классами вообще не заметите.
А, я понял что причина в привате, у меня по заданию всё приватом сделать
В таком случае пойду разбираться как доставать переменные для общего пользования
0
2 / 2 / 0
Регистрация: 12.10.2016
Сообщений: 12
27.03.2023, 16:15
C++
1
2
3
4
5
6
7
8
9
10
#pragma once
class Food {
private:
    int        type;    // Тип изделия
    int        quant;   // Количество изделия
    char*      name;    // Наименование изделия
    double     cost;    // Цена изделия
    double     weight;  // Вес изделия
    static int count;   // Счётчик существующих объектов класса
}
Здравствуйте.
Используйте в определении класса модификатор доступа не private, а public.
Тогда можно будет так обращаться к полям f[i].name;
1
0 / 0 / 0
Регистрация: 21.09.2022
Сообщений: 76
27.03.2023, 16:17  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
Если вы private: в описании класса замените на public: - то разницы между структурами и классами вообще не заметите.
Спасибо

Добавлено через 1 минуту
Цитата Сообщение от Sv1ft Посмотреть сообщение
Здравствуйте.
Используйте в определении класса модификатор доступа не private, а public.
Тогда можно будет так обращаться к полям f[i].name;
Вам тоже спасибо!
Уже разобрался с этим моментом
0
2 / 2 / 0
Регистрация: 12.10.2016
Сообщений: 12
27.03.2023, 16:19
Хорошо
Вам тогда нужно использовать сеттеры и геттеры
вот здесь на мой взгляд не плохо объясняется что это такое
https://www.youtube.com/watch?v=1GdzmKdBf9s&t=4s
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
27.03.2023, 16:26
-АнКи-, задача какая стоит: просто формально отчитаться о наличии класса в коде, или разобраться как применять классы?
Если вы просто оставите все поля public, а весь остальной код никак не поменяется, то ни о каком использовании классов не может идти и речи, у вас точно также останутся те же самые структурные типы в коде, только объявленные с ключевым словом class.

Добавлено через 1 минуту
Цитата Сообщение от -АнКи- Посмотреть сообщение
Я могу разве что дать ссылку на гитхаб, ибо у меня с жатыми строками и парсингом строки ушло на это более 500 строк
Можете дать. Это даже лучше.
Меня правда только один конкретный момент интересовал: как вы выделяете память для полей структуры. Вряд ли это все 500 строк занимает.
1
0 / 0 / 0
Регистрация: 21.09.2022
Сообщений: 76
27.03.2023, 16:30  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
задача какая стоит: просто формально отчитаться о наличии класса в коде, или разобраться как применять классы?
Если вы просто оставите все поля public, а весь остальной код никак не поменяется, то ни о каком использовании классов не может идти и речи, у вас точно также останутся те же самые структурные типы в коде, только объявленные с ключевым словом class.
В моём случае задача заключается сдать лабораторную работу, но так как я поступал по своему желанию, то касательно моя задача заключается в понимании программирования досконально
Поэтому задача скорее разобраться в классах и как с ними работать, а из задания лабы все поля должны быть private

Добавлено через 3 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Меня правда только один конкретный момент интересовал: как вы выделяете память для полей структуры. Вряд ли это все 500 строк занимает.
А, для полей, да также как и в моём вопросе
Под саму структуру константой делал 100 позиций(Сказали пока динамически не расширять в ходе программы):
C++
1
Student* stud = new Stud[100];
А под строки типа char*:
C++
1
2
char* surname = new char[strlen(destination) + 1]  // Тут имеется ввиду ввод в другую строку размером 4096 символов, потом скан длины и уже выделять под конкретную длину
delete[] surname;
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
27.03.2023, 16:30
-АнКи-, ну тогда если вы не против разобраться, то начнем с моего первого вопроса в этой теме. Это был наводящий вопрос.
Повторю: сейчас вам не понятно как обращаться с конструктором и использовать его для выделения памяти для полей. Вопрос: как вы поступали в этом случае раньше, когда у вас были только структуры? Как вы выделяли память для полей? Покажите.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
27.03.2023, 16:30
Цитата Сообщение от -АнКи- Посмотреть сообщение
а из задания лабы все поля должны быть private
Ну тогда либо в лабе должно быть растолковано как с этим жить, либо препод на лекциях рассказывал, либо главы из книжек, рекомендованные преподом, надо почитать.
В наши годы так было.

Мне любопытно: что из этого вы не сделали? или что не так в вашем учебном процессе? что из перечисленного отсутствует?
1
0 / 0 / 0
Регистрация: 21.09.2022
Сообщений: 76
27.03.2023, 16:31  [ТС]
Цитата Сообщение от Sv1ft Посмотреть сообщение
Хорошо
Вам тогда нужно использовать сеттеры и геттеры
вот здесь на мой взгляд не плохо объясняется что это такое
https://www.youtube.com/watch?v=1GdzmKdBf9s&t=4s
Я только начал искать информацию по этой теме, спасибо!
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
27.03.2023, 16:33
Цитата Сообщение от -АнКи- Посмотреть сообщение
А под строки типа char*:
C++
1
2
char* surname = new char[strlen(destination) + 1] // Тут имеется ввиду ввод в другую строку размером 4096 символов, потом скан длины и уже выделять под конкретную длину
delete[] surname;
Ну тогда этот код вы теперь можете смело убрать в констуктор и деструктор. Впрочем, в структурах вы могли сделать тоже самое
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
27.03.2023, 16:33
Цитата Сообщение от -АнКи- Посмотреть сообщение
А под строки типа char*:
Хорошо.
Для начала, вот эта строка:
Цитата Сообщение от -АнКи- Посмотреть сообщение
surname = new char[strlen(destination) + 1]
должна быть в конструкторе.
При этом destination - это параметр конструктора типа const char*.
А surname - это поле класса.

Цитата Сообщение от -АнКи- Посмотреть сообщение
delete[] surname;
А эта строка - в деструкторе.

Далее вам понадобятся такие понятия как "конструктор копирования" и "оператор присваивания". Вы с ними знакомы?
1
0 / 0 / 0
Регистрация: 21.09.2022
Сообщений: 76
27.03.2023, 16:38  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
Ну тогда либо в лабе должно быть растолковано как с этим жить, либо препод на лекциях рассказывал, либо главы из книжек, рекомендованные преподом, надо почитать.
В наши годы так было.
Мне любопытно: что из этого вы не сделали? или что не так в вашем учебном процессе? что из перечисленного отсутствует?
1)Лабы старого образца и в них скорее всё на си, к тому же там в целом не очень понятно
2)На лекциях я побывал 2 раза и когда мне надо было сдавать лабу уже на следующий день, всё что я узнал это как устроен компьютер(И без них знал, спасибо. Больше не хожу туда. Сам разбираюсь по несколько часов, так даже лучше. Ну, в случае чего помогает Семинарист на парах)
3)Преподы ничего не рекомендуют
4)Кстати на счёт семинариста, у нас ведёт девушка, которая не знает как использовать ctrl+c и т.п.
5)А используя некоторые функции по типу strcpy не может перевести на новый лад типа strcpy_s? потому что не знает, а вижуал студио ругается. Приходится синтаксис самому вычитывать.

Добавлено через 1 минуту
Цитата Сообщение от KSergey9 Посмотреть сообщение
Ну тогда этот код вы теперь можете смело убрать в констуктор и деструктор. Впрочем, в структурах вы могли сделать тоже самое
Я так и делал в структурах, у меня просто возникла проблема ошибки и благодаря вам всем я понял, что это из-за полей приват. Спасибо ещё раз

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
Хорошо.
Для начала, вот эта строка:
Сообщение от -АнКи-
surname = new char[strlen(destination) + 1]
должна быть в конструкторе.
При этом destination - это параметр конструктора типа const char*.
А surname - это поле класса.
Сообщение от -АнКи-
delete[] surname;
А эта строка - в деструкторе.
Ооо, это классная вещь, я думал куда их прописывать, теперь всё сошлось
А на счёт копирования и присваивания наслышан, но не вникал ещё
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
27.03.2023, 16:44
Цитата Сообщение от -АнКи- Посмотреть сообщение
А на счёт копирования и присваивания наслышан, но не вникал ещё
Эти темы рядом и напрямую касаются управлением ресурсами (памятью для полей) в вашем классе. Поэтому их охватить нужно.
1
0 / 0 / 0
Регистрация: 21.09.2022
Сообщений: 76
27.03.2023, 16:52  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Эти темы рядом и напрямую касаются управлением ресурсами (памятью для полей) в вашем классе. Поэтому их охватить нужно.
Принято, изучу. Спасибо!
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
27.03.2023, 16:58
Цитата Сообщение от -АнКи- Посмотреть сообщение
Больше не хожу туда.
Это пять! верной дорогой.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
27.03.2023, 18:02
Цитата Сообщение от KSergey9 Посмотреть сообщение
struct от class в С++ отличаются только тем, что в struct поля по умолчанию public, а в class поля по умолчанию private.
Всё. Других различий нет.
KSergey9, не совсем так. Есть ещё одно различие.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.03.2023, 18:02
Помогаю со студенческими работами здесь

Два класси и сделать метод первого классу дружественным к второму классу
Два класси и сделать метод первого классу дружественным к второму классу.Срочно!!!!

как на паскале сделать "перейти к следуючему" "перейти к предыдучему"
Написать проогррамму в которой описывается массив записей ,хранящий следующую информацию :ФИО сотрудника.подразделение ,оклад .Программа...

Как обратиться к классу?
Смотри у меня файл создается в классе и открывает в классе идет обработка вся там, но первой кнопкой я обращаюсь к классу что бы произвел...

Как обратиться к высшему классу?
вопрос наверно сформулирован коряво, но как смог :pardon: проблема такая: есть два класса, в одном из них создается переменная другого...

Как привязать картинку к классу?
Начал изучать Windows Form и вот передо мной встала проблема: Например у меня есть класс шарика, который должен перемещаться по...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru