Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Hrollo
34 / 34 / 6
Регистрация: 05.11.2013
Сообщений: 147
10.01.2014, 11:09     Помогите разобраться с классом (STUDENT). #1
Всем привет недавно начал изучать классы и возникло несколько впопросов если не трудно помогите разобраться.(Я попробовал написать класс студент пока что он может только заполнять поля класса и сортировать в нем данные по имени).
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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
10.01.2014, 11:39     Помогите разобраться с классом (STUDENT). #2
Цитата Сообщение от Hrollo Посмотреть сообщение
1)Как я понял класс должен реализовываться в отдельных файлах(в заголовочном файле должен быть его прототип, а в срр файле должна быть реализация методов).Если в программе будет несколько классов то каждый из них должен реализовываться в отдельном файле или все классы можно реализовать в одном файле?
удобнее если у тебя скажем несколько классов, но 1 из них является базовым, а др производными(наследование) то удобнее в 1 , хотя тоже кому как...
Как и с заголовочным файлом - надо всё делать по смыслу, т.е. у тебя 3 класса, скажем студент, человек, и атвомобиль, при этом студен это производный класс от человека, то удобнее реализовать 2 хедера, в 1ом будет описан класс челвоек и студент, во 2ом- автомобиль.
Цитата Сообщение от Hrollo Посмотреть сообщение
2)Обязательно ли для классов которые не изменяют значения переменных добавлять спецификатор const?
Не обязательно, но желательно, дабы избежать ошибок которые могут где-то всплыть.
Цитата Сообщение от Hrollo Посмотреть сообщение
Конструктор с параметрами в основном предназначен для считывания данных из файла или лучше в функции мейн создавать переменные и при помощи них заполнять поля класса?
Конструктор для этого и предназначен, вы создаете какие-то переменные по ходу выполнения программы и ими инициализируете объект, при помощи конструктора

Добавлено через 10 минут
Цитата Сообщение от Hrollo Посмотреть сообщение
5)Можете объяснить почему после функции сортировки вызывается деструктор?
в swap передаёте по значению, он работает с копиямии после удаляет - отсюда деструктор вызывается, мб о этому..
Aloir
 Аватар для Aloir
216 / 216 / 13
Регистрация: 17.12.2010
Сообщений: 688
10.01.2014, 11:57     Помогите разобраться с классом (STUDENT). #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);
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.01.2014, 12:05     Помогите разобраться с классом (STUDENT). #4
Цитата Сообщение от Aloir Посмотреть сообщение
if(name) delete name;
проверка перед delete не нужна.
Hrollo
34 / 34 / 6
Регистрация: 05.11.2013
Сообщений: 147
10.01.2014, 12:48  [ТС]     Помогите разобраться с классом (STUDENT). #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)?
Aloir
 Аватар для Aloir
216 / 216 / 13
Регистрация: 17.12.2010
Сообщений: 688
10.01.2014, 13:51     Помогите разобраться с классом (STUDENT). #6
Цитата Сообщение от Hrollo Посмотреть сообщение
Спасибо, но теперь у меня появилось еще пару вопросов:
1)Выходит что бы передать параметры в функцию setDate нужно создать переменные соответствующего типа в функции мейн? Или эти переменные надо создать в разделе public?
2)Выходит что нужно оставить одну из двух функций(конструктор с параметрами или ф-цию setDate)?
1. Да. в main
По хорошему в классе не должно быть всяких операция ввода, т.к потеряем "переносимость" класса. например с консольки на формы.

2. Ну в данном случае да..
а так:у вас студент, вы его инициализировали с помощью конструктора, а потом возникла необходимость поменять ему имя используем SetDate
Yandex
Объявления
10.01.2014, 13:51     Помогите разобраться с классом (STUDENT).
Ответ Создать тему
Опции темы

Текущее время: 19:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru