Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Hrollo
34 / 34 / 6
Регистрация: 05.11.2013
Сообщений: 147
#1

Помогите разобраться с классом (STUDENT). - C++

10.01.2014, 11:09. Просмотров 410. Ответов 5
Метки нет (Все метки)

Всем привет недавно начал изучать классы и возникло несколько впопросов если не трудно помогите разобраться.(Я попробовал написать класс студент пока что он может только заполнять поля класса и сортировать в нем данные по имени).
1)Как я понял класс должен реализовываться в отдельных файлах(в заголовочном файле должен быть его прототип, а в срр файле должна быть реализация методов).Если в программе будет несколько классов то каждый из них должен реализовываться в отдельном файле или все классы можно реализовать в одном файле?
2)Обязательно ли для классов которые не изменяют значения переменных добавлять спецификатор const?
3)Конструктор с параметрами в основном предназначен для считывания данных из файла или лучше в функции мейн создавать переменные и при помощи них заполнять поля класса?
4)Правильно ли я написал метод setDate?
5)Можете объяснить почему после функции сортировки вызывается деструктор?
Заголовочный файл для класса
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
#pragma once
#include <iostream>
#include <cstring>
 
#ifndef _STUDENT_H_
#define _STUDENT_H_
 
using namespace std;
 
class Student
{
private:
    char *name;
    int  score;
public:
    Student(void);
    ~Student(void);
    Student(char*,int);
    void setDate();
    void getDate();
    void sort(Student *cl,int size);
};
 
#endif
Реализация методов

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
#include "Student.h"
 
 
Student::Student(void)
{
    cout<<"constructor"<<endl;
    name = "";
    score = 0;
}
 
Student::Student(char *n,int sc)
{
    name = n;
    score = sc;
}
 
Student::~Student(void)
{
    cout<<"Destructor"<<endl;
}
void Student::setDate()
{
    char str[25];
    cout<<"Enter name:";
    cin.getline(str,25);
    char *p = new char[strlen(str)+1];
    strcpy(p,str);
    name = p;
    cout<<"Enter score "<<name<<" :";
    (cin>>score).get();
}
void Student::getDate()
{
    cout<<name<<"\t"<<score<<endl;
}
 
void Student::sort(Student *st,int size)
{
    for(int i(0);i<size-1;i++)
    {
        for(int j(i+1);j<size;j++)
        {
            if(strcmp(st[i].name,st[j].name)>0)
                swap(st[i],st[j]);
        }
    }
}
Ф-ция мейн

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <conio.h>
#include "Student.h"
 
using namespace std;
 
int main()
{
    int n=5;
    Student *school = new Student[n];
    for(int i(0);i<n;i++)
    {
        school[i].setDate();
        cout<<endl;
    }
    school[0].sort(school,n);
    //Здесь непонятно почему вызывается деструктор
    for(int i(0);i<n;i++)
        school[i].getDate();
    delete [] school;
    _getch();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2014, 11:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Помогите разобраться с классом (STUDENT). (C++):

Программа с использованием дружественных функций и классов. Создайте программу с классом student - C++
19..Разработайте алгоритм и создайте программу с использованием дружественных функций и классов. ЯЗЫК С++ Создайте программу с классом...

Создайте программу с классом student, который включает в себя данные о студентах, желающих получить места в общежитии. - C++
Создайте программу с классом student, который включает в себя данные о студентах, же¬лающих получить места в общежитии. Общежитие в первую...

Не могу разобраться с шаблонным классом - C++
Привет. Не могу разобраться в нижеизложенной ситуации. Вопрос: почему такая конструкция не работает, и как заставить её работать?template...

Помогите написать класс STUDENT - C++
1. Написать программу в соответствии с заданием. Для класса предусмотреть конструктор по умолчанию, конструктор копирования, деструктор,...

Создать класс student, который использует файл student.txt - C++
Доброе время суток. Тащемта задача такова: Нужно создать класс student, который использует файл student.txt(содержит в себе список...

If else помогите разобраться - C++
Доброго времени суток всем. Не так давно начали программировать в C++ MS Visual Studio 2010? и возникло у меня затруднение в работе с if ...

5
dzrkot
zzzZZZ...
523 / 353 / 54
Регистрация: 11.09.2013
Сообщений: 2,036
10.01.2014, 11:39 #2
Цитата Сообщение от Hrollo Посмотреть сообщение
1)Как я понял класс должен реализовываться в отдельных файлах(в заголовочном файле должен быть его прототип, а в срр файле должна быть реализация методов).Если в программе будет несколько классов то каждый из них должен реализовываться в отдельном файле или все классы можно реализовать в одном файле?
удобнее если у тебя скажем несколько классов, но 1 из них является базовым, а др производными(наследование) то удобнее в 1 , хотя тоже кому как...
Как и с заголовочным файлом - надо всё делать по смыслу, т.е. у тебя 3 класса, скажем студент, человек, и атвомобиль, при этом студен это производный класс от человека, то удобнее реализовать 2 хедера, в 1ом будет описан класс челвоек и студент, во 2ом- автомобиль.
Цитата Сообщение от Hrollo Посмотреть сообщение
2)Обязательно ли для классов которые не изменяют значения переменных добавлять спецификатор const?
Не обязательно, но желательно, дабы избежать ошибок которые могут где-то всплыть.
Цитата Сообщение от Hrollo Посмотреть сообщение
Конструктор с параметрами в основном предназначен для считывания данных из файла или лучше в функции мейн создавать переменные и при помощи них заполнять поля класса?
Конструктор для этого и предназначен, вы создаете какие-то переменные по ходу выполнения программы и ими инициализируете объект, при помощи конструктора

Добавлено через 10 минут
Цитата Сообщение от Hrollo Посмотреть сообщение
5)Можете объяснить почему после функции сортировки вызывается деструктор?
в swap передаёте по значению, он работает с копиямии после удаляет - отсюда деструктор вызывается, мб о этому..
1
Aloir
218 / 218 / 13
Регистрация: 17.12.2010
Сообщений: 692
10.01.2014, 11:57 #3
Цитата Сообщение от Hrollo Посмотреть сообщение
4)Правильно ли я написал метод setDate?
5)Можете объяснить почему после функции сортировки вызывается деструктор?
4. я бы написал так:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int Student::setDate(TCHAR *inName,size_t inlen, int inScore /*= 0*/)
{
    if(inName == NULL)
        return -1;
 
    if(name)
        delete name;
 
    name = new TCHAR[inlen+1];
 
    _tcscpy_s(name,inlen,inName);
    name[inlen]='\0';
    score = inScore;
}
и не верно инициализируешь указатель в конструкторе
C++
1
name = NULL;

5. это из-за функции swap, дабы понять сюда

Добавлено через 6 минут
+1ыфва

Добавлено через 2 минуты
описачка
C++
1
_tcscpy_s(name,inlen+1,inName);
1
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
10.01.2014, 12:05 #4
Цитата Сообщение от Aloir Посмотреть сообщение
if(name) delete name;
проверка перед delete не нужна.
1
Hrollo
34 / 34 / 6
Регистрация: 05.11.2013
Сообщений: 147
10.01.2014, 12:48  [ТС] #5
Цитата Сообщение от Aloir Посмотреть сообщение
4. я бы написал так:
[SPOILER]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int Student::setDate(TCHAR *inName,size_t inlen, int inScore /*= 0*/)
{
    if(inName == NULL)
        return -1;
 
    if(name)
        delete name;
 
    name = new TCHAR[inlen+1];
 
    _tcscpy_s(name,inlen,inName);
    name[inlen]='\0';
    score = inScore;
}
[/CPP]
Спасибо, но теперь у меня появилось еще пару вопросов:
1)Выходит что бы передать параметры в функцию setDate нужно создать переменные соответствующего типа в функции мейн? Или эти переменные надо создать в разделе public?
2)Выходит что нужно оставить одну из двух функций(конструктор с параметрами или ф-цию setDate)?
0
Aloir
218 / 218 / 13
Регистрация: 17.12.2010
Сообщений: 692
10.01.2014, 13:51 #6
Цитата Сообщение от Hrollo Посмотреть сообщение
Спасибо, но теперь у меня появилось еще пару вопросов:
1)Выходит что бы передать параметры в функцию setDate нужно создать переменные соответствующего типа в функции мейн? Или эти переменные надо создать в разделе public?
2)Выходит что нужно оставить одну из двух функций(конструктор с параметрами или ф-цию setDate)?
1. Да. в main
По хорошему в классе не должно быть всяких операция ввода, т.к потеряем "переносимость" класса. например с консольки на формы.

2. Ну в данном случае да..
а так:у вас студент, вы его инициализировали с помощью конструктора, а потом возникла необходимость поменять ему имя используем SetDate
0
10.01.2014, 13:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2014, 13:51
Привет! Вот еще темы с ответами:

Помогите разобраться - C++
У меня есть координаты North,West,East,South. Мне нужно отобразить их на осях ОХ и ОУ. Допустим я ввожу North 5 East 3 South 1 ...

Помогите разобраться с циклом while. - C++
Здравствуйте. Уже долго мучаюсь с крестиками-ноликами. Наконец то подошел финал, как вдруг на самом простом запутался. Помогите...

Помогите разобраться в коде - C++
Помогите мне разобраться в коде. Заранее спасибо. int seek_substring_KMP (char s, char p) { int i, j, N, M; N = strlen(s); M =...

Помогите разобраться с try-catch - C++
#include &lt;iostream.h&gt; int main() { int s = 0; try { int a = 6 / s; } catch(char* exception) {


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.