Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Начал изучать классы... Оцените 
V
    Опции темы
mr.Anderson
Дата 13.6.2006, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Я сейчас только начал работать с классами, написал свой первый класс... Хотел бы услышать вашу оценку с точки зрения правильности, уместности использования всех операторов и функций и с точки зрения оптимизации (если она возможна, то скажите, как это сделать).

Определение класса, как я прочитал в учебнике, надо отделять от реализации. Я так и сделал.

Файл CLASS.H
Код

#ifndef CLASS_H
#define CLASS_H

//-----------------------------------------------------

typedef unsigned int ui;
//-----------------------------------------------------

class GMDate
{
 public:

  GMDate();

  void SetFullDate(void);
  void GetDate(void);
  void GetDay(void);
  void GetMonth(void);
  void GetYear(void);


 private:

  void SetDate(ui d, ui m, ui y);
  void CheckDate(ui *const d, ui *const m, ui *const y);
  void GetMonthName(ui m);

  ui day,
     month,
     year;
};
//-----------------------------------------------------

#endif

Файл реализации класса CLASS_RELEASE.CPP
Код

#include "class.h"
//-----------------------------------------------------
//-----------------------------------------------------
//-----------------------------------------------------

GMDate::GMDate()
{
 day=month=year=0;
}
//-----------------------------------------------------

void GMDate::SetDate(ui d=0, ui m=0, ui y=0)
{
 day=d;
 month=m;
 year=y;
}
//-----------------------------------------------------

void GMDate::CheckDate(ui *const d, ui *const m, ui *const y)
{
 ui maxday=0;

 cout<<"\nchecking...\n";

 if( *y % 4 == 0 ) maxday=29;
 else maxday=28;

 if( *y < 1000 )
 {
  cout<<"Year too small! It will be set on 2006.\n";
  *y=2006;
 }

 if( *y > 9999 )
 {
  cout<<"Year too big! It will be set on 2006.\n";
  *y=2006;
 }

 if( *m < 1 )
 {
  cout<<"Minimal value of month is 1.\n";
  *m = 1;
 }

 if( *m > 12 )
 {
  cout<<"Maximal value of month is 12.\n";
  *m = 12;
 }

 if( *d < 1 )
 {
  cout<<"Minimal value of day is 1.\n";
  *d = 1;
 }

 if( *d > 31 )
 {
  cout<<"Maximal value of day is 31.\n";
  *d = 31;
 }
 if( (*m == 2) && (*d > maxday) )
 {
  cout<<"Maximal day on Fabruary = "<<maxday<<".\n";
  *d=maxday;
 }

 cout<<"\n";
}
//-----------------------------------------------------

void GMDate::SetFullDate(void)
{
 ui d,
     m,
     y;

 cout<<"Enter day, please: "; cin>>d;
 cout<<"Enter month, please: "; cin>>m;
 cout<<"Enter year, please (format YYYY): "; cin>>y;

 CheckDate(&d, &m, &y);

 SetDate(d, m, y);
}
//-----------------------------------------------------

void GMDate::GetDate(void)
{
 cout<<"\nAll errors (if they has detected) fixed. Current date: ";

 if( day < 10 )
  cout<<"0"<<day;
 else
  cout<<day;

 cout<<"/";

 if( month < 10 )
  cout<<"0"<<month;
 else
  cout<<month;

 cout<<"/";

 cout<<year<<"\n";
}
//-----------------------------------------------------

void GMDate::GetDay(void)
{
 cout<<"Day: ";

 if( day < 10 )
  cout<<"0"<<day;
 else
  cout<<day;

 cout<<"\n";
}
//-----------------------------------------------------

void GMDate::GetMonth(void)
{
 cout<<"Month: ";

 if( month < 10 )
  cout<<"0"<<month;
 else
  cout<<month;

 cout<<" ", GetMonthName(month), cout<<"\n";
}
//-----------------------------------------------------

void GMDate::GetYear(void)
{
 cout<<"Year: "<<year<<"\n";
}
//-----------------------------------------------------

void GMDate::GetMonthName(ui m)
{
 switch(m)
 {
  case 1: cout<<"(January)"; break;
  case 2: cout<<"(Fabruary)"; break;
  case 3: cout<<"(March)"; break;
  case 4: cout<<"(April)"; break;
  case 5: cout<<"(May)"; break;
  case 6: cout<<"(June)"; break;
  case 7: cout<<"(July)"; break;
  case 8: cout<<"(August)"; break;
  case 9: cout<<"(September)"; break;
  case 10: cout<<"(October)"; break;
  case 11: cout<<"(November)"; break;
  case 12: cout<<"(December)"; break;
 }
}
//-----------------------------------------------------

И главный файл программы, использующей этот класс:
Код

//-----------------------------------------------------

#include <iostream>
#include <conio>

using namespace std;
//-----------------------------------------------------

#include "class.h"
#include "class_release.cpp"
//-----------------------------------------------------

int main(void)
{
 GMDate object;

 object.SetFullDate();
 object.GetDate();
 object.GetDay();
 object.GetMonth();
 object.GetYear();

 getch();
}
//-----------------------------------------------------

Прошу оценить по приведенным выше критериям...  

Это сообщение отредактировал(а) sim7 - 13.6.2006, 17:26


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
pablo
Дата 13.6.2006, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

Репутация: 4
Всего: 6



По идее Get должен что-то возвращать, а не выводить  


--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
MAKCim
Дата 13.6.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



1. Использование потоков внутри методов - нехорошо (зависимость от библиотеки)
Решение: убрать работу с потоками из методов
2. 
Цитата

Код

if( *d > 31 )
 {
  cout<<"Maximal value of day is 31.\n";
  *d = 31;
 }


для таких ситуаций лучше воспользоваться исключениями
(здесь опять потоки)
3.
Цитата

Код

void GMDate::GetMonthName(ui m)
{
 switch(m)
 {
  case 1: cout<<"(January)"; break;
  case 2: cout<<"(Fabruary)"; break;
  case 3: cout<<"(March)"; break;
  case 4: cout<<"(April)"; break;
  case 5: cout<<"(May)"; break;
  case 6: cout<<"(June)"; break;
  case 7: cout<<"(July)"; break;
  case 8: cout<<"(August)"; break;
  case 9: cout<<"(September)"; break;
  case 10: cout<<"(October)"; break;
  case 11: cout<<"(November)"; break;
  case 12: cout<<"(December)"; break;
 }
}


некрасиво  smile 
почему бы статический массив не завести ?
Код

...
static const char* months[12];
...
const char* GMDate::months[12]={"January",...};

4. void в качестве параметра метода можно не писать
Если уж так хочется поиграться с потоками перегрузи
operator<<, operator>> 
Код

ostream& operator<<(ostream& stream, const GMDate& obj)
{
    stream<<obj.GetDay()<<obj.GetMonth()<<obj.GetYear();
}

да кстати, методы GetDay(), GetMonth(), GetYear() лучше (даже нужно) сделать константными
Код

void GetDay() const;
 

Это сообщение отредактировал(а) MAKCim - 13.6.2006, 17:44


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Dray
Дата 13.6.2006, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 7.10.2003
Где: г. Всеволожск

Репутация: 2
Всего: 6



Цитата(pablo @  13.6.2006,  17:37 Найти цитируемый пост)
По идее Get должен что-то возвращать, а не выводить   

Именно! Здесь никак нельзя извлеч данные. Этот класс должен быть универсальным, так чтобы он мог работать не только в консольном приложении. В оконном ведь cout ничего не даст!
И методы, которые не изменяют экземпляр класса, лучше объявлять статическими, вдруг захочется с константой работать.

Добавлено @ 17:44 
Цитата(Dray @  13.6.2006,  17:42 Найти цитируемый пост)
лучше объявлять статическими

Т. е. константными! Извеняюсь!
 


--------------------
忍者

user posted image
PM MAIL   Вверх
MAKCim
Дата 13.6.2006, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

Код

void GMDate::CheckDate(ui *const d, ui *const m, ui *const y)


почему бы сюда не передавать объект (ссылку) на GMDate
а сам метод CheckDate не сделать статическим? 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
mr.Anderson
Дата 13.6.2006, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Пока со статическими и динамическими методами я не знаком, поэтому...

А вот мысль убрать потоки из классов - да, неплохо. В принципе, я как раз и хотел сделать потоки внутри классов в моей конкретной практической задаче, но в целом вы правы.

Спасибо! Буду дальше рыть. 


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0992 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.