Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Перегрузка констуктора

Ответить
Настройки темы
C/C++ - Перегрузка констуктора

Аватара для котвася

Пользователь


Сообщения: 147
Благодарности: 5

Профиль | Отправить PM | Цитировать


Как правильно перегружать конструктор? Помогите, не понятно.
Код: Выделить весь код
#include <iostream>
class Date
{
public:
	Date(int, int);
	Date(int, int, int);
	void print() const;
	void setDate(int, int, int);
private:
	int day;
	int month;
	int year;
};

Date::Date(int dd, int mm, int yyyy)
{
	day = dd;
	month = mm;
	year = yyyy;
}

void Date::setDate(int dd, int mm, int yyyy)
{
	day = dd;
	month = mm;
	year = yyyy;
}
void Date::Date(int dd, int yyyy)
{
	day = dd;
	year = yyyy;
}

void Date::print() const
{
	std::cout << day << "/" << month << "/" << year << std::endl;
}
int main()
{
	setlocale(LC_ALL,".1251");
	Date d(2,2,2000);
	Date d2(1,1991);

	d.print();
	d2.print();

	system("pause");
	return 0;
}

Отправлено: 22:11, 15-07-2010

 

Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Цитата котвася:
Так что думаю тут без * никак так как надо передавать массив. Или есть другой "правильный путь"? »
Правильно. Используй символьный массив указателей. Я когда-то решал подобную задачу.

Date.h

Код: Выделить весь код
// Определение класса Time
// Функции-члены определены в Date1.cpp

// Процессорные директивы, которые предотвращают
// многократное включение заголовочного файла
#ifndef DATE_H
#define DATE_H

class Date{
public:
    // конструктор
    Date(int = 1, int = 1, int = 1990);

    // печать дат в формате месяца/дня/года. 05.01.1997
    void print() const;

    // печать дат в формате число, срока названия месяца, год. 5 января 1997 год.
    void print_Day_StringMonth_Year() const;
    ~Date();

    // функцияи 'set' Установка и проверка вводимых параметров
    void setDate(int, int, int);   // установка дня, месяца, года
private:
    int day;       // День от 1 - 31
    int month;     // Месяц от 1 - 12
    int year;     // Год. Целое число

    // функция-утилита для проверки соответствия дня месяца и году
    int checkDay(int); // На всякий случай ;)))))
 };

#endif
Date.cpp

Код: Выделить весь код
// определения функции-членов класса Date
#include <iostream.h>
using std::cout;
using std::endl;

#include "date.h"

// конструктор: поддержка соответствующего значения месяца;
// вызвать функцию-утилиту checkDay для поддержки соответствующего
// значения дня
Date::Date(int dy, int mn, int yr)
{
  setDate(dy, mn, yr); // Функция правильной установки дня, месяца, и года
}
// печать объекта Date в форме месяца/дня/года. 05.01.1997--------------------
void Date::print() const
{
  int NumbNullDay_and_Month, // Счётчик
      NumbNull_Day, // индекс для массива NumberDay_Month, для правильного отображения числа ДНЯ с нулём
      NumbNull_Month; // индекс для массива NumberDay_Month, для правильного отображения числа МЕСЯЦА с нулём

  static const char *NumberDay_Month [10] = {"", "01", "02", "03", "04", "05", "06", "07", "08", "09"};

  // Проверка дня, если в числе ДНЯ один разряд, вычислить соответствующий индекс массива NumberDay_Month...
  if(day < 10){
     for(NumbNullDay_and_Month = 0; NumbNullDay_and_Month < 11; NumbNullDay_and_Month++){
        if(NumbNullDay_and_Month == day)
           NumbNull_Day = NumbNullDay_and_Month;
    }
  }
  // Если в числе ДНЯ, больше одного разряда, то присвоить переменной NumbNull_Day, тоже число, что и было
  else if(day > 9)
     NumbNull_Day = day;

  // Проверка дня, если в числе МЕСЯЦА один разряд, вычислить соответствующий индекс массива NumberDay_Month...
  if(month < 10){
     for(NumbNullDay_and_Month = 0; NumbNullDay_and_Month < 11; NumbNullDay_and_Month++){
        if(NumbNullDay_and_Month == month)
           NumbNull_Month = NumbNullDay_and_Month;
    }
  }
  // Если в числе МЕСЯЦА, больше одного разряда, то присвоить переменной NumbNull_Day, тоже число, что и было
  else if(month > 9)
     NumbNull_Month = month;

  // Вывод вариантов
  if(day < 10 && month < 10) // Если в ДНЕ И в МЕСЯЦЕ число меньше десяти
    cout<<NumberDay_Month[NumbNull_Day]<<"."<<NumberDay_Month[NumbNull_Month]<<"."<<year<<endl;
  else if(day < 10 && month > 9) // Если в ДНЕ меньше деСяти, И в МЕСЯЦЕ больше деВяти
    cout<<NumberDay_Month[NumbNull_Day]<<"."<<NumbNull_Month<<"."<<year<<endl;
  else if(day > 9 && month < 10) // Если в ДНЕ больше деВяти, И в МЕСЯЦЕ больше деСяти
    cout<<NumbNull_Day<<"."<<NumberDay_Month[NumbNull_Month]<<"."<<year<<endl;
  else if(day > 9 && month > 9)  // Если в ДНЕ И в МЕСЯЦЕ число больше деСяти
    cout<<NumbNull_Day<<"."<<NumbNull_Month<<"."<<year<<endl;
}

// печать дат в формате число, строка названия месяца, год--------------------
void Date::print_Day_StringMonth_Year() const
{
  int i;
  static const char *Month [13] = {"", "Yanvaria", "Fevralia", "Marta", "Aprelia",
                                  "May", "Yuni", "Yuli", "Avgusta", "Sentyabria",
                                  "Ortyabria", "Noyabria", "Dekabria"};

      for(i = 0; i < 14; i++){
          if(month == i)
              cout<<day<<" "<<Month[i]<<" "<<year<<" God."<<endl;
        }
}
// функция-утилита для поддержки соответствующего
// значения дня в зависимости от месяца и года.
// является ли 2000-й год високосным?-----------------------------------------
int Date::checkDay(int testDay)
{
  static const int daysPerMonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

  if(testDay > 0 && testDay <= daysPerMonth[month])
     return testDay;

  if(month == 2 &&      // февраль: проверка високосноо года
           testDay == 29 &&
              (year % 400 == 0 || (year %4 == 0 && year % 100 != 0)))
     return testDay;

  cout<<"  DENY:  "<<testDay<<" NEPRAVILNIY. USTANOVITY DENY 1 \n\n";

  print();
  print_Day_StringMonth_Year();

  return 1;           // если значение неправильное
}
// Проверка и Установка даты через setDate------------------------------------
void Date::setDate(int dy, int mn, int yr)
{
  if(mn > 0 && mn <= 12)     // проверка месяца
     month = mn;
  else{
     month = 1;
     cout<<"  MEZYAC: "<<mn<<" NEPRAILNIY. USTANOVITY MEZYAC 1. \n\n";
    }
  year = yr;
  day = checkDay(dy);       // проверка дня

  print();
  print_Day_StringMonth_Year();

  cout<<"\n  KONSTRUKPOR OBEKTA 'DATE'\n";
  cout<<endl;
}
// деструктор-----------------------------------------------------------------
Date::~Date()
{
  cout<<"  DESTRUKTOR DATE-OBEKTA DLA DATY ";
  print();
  cout<<endl;
}

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

// демонстрация композиции: объект с объектами-членами
#include <iostream.h>
using std::cout;
using std::cin;
using std::endl;

#include "date.h"
int main()
{
  int dayy,
      monthh,
      yearr,
      z;

  Date d(3, 12, 1988);
  cout<<'\n';

  // Формат 05.01.1997
  d.print();

  cout<<'\n';

  // Формат 5 января 1997 года.
  d.print_Day_StringMonth_Year();

  cout<<"\n  PROVERKA KONSTRUKTORA 'DATE' S NEPRAVILYNIVI ZNACHENIAVI:  \n";
  Date dd(14, 35, 1994);       // неправильные Date-значения
  cout<<endl;

  do{
    cout<<"\n Enter '0' START AND '-1' FINISH: ";
    cin>>z;

    cout<<endl;

    // Ввод нужных значений
      cout<<"Enter Day: ";
      cin>>dayy;
      cout<<"Enter Month: ";
      cin>>monthh;
      cout<<"Enter Year: ";
      cin>>yearr;

      // Функция установки и проверки правильности ввода
      d.setDate(dayy, monthh, yearr);

      // Вывод вариантов отображения
      d.print();
      d.print_Day_StringMonth_Year();
      }
  while(z != -1);

  cin>>z;
        return 0;
}
//---------------------------------------------------------------------------

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif

Это сообщение посчитали полезным следующие участники:

Отправлено: 10:13, 18-07-2010 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


ИО Капитана Очевидности


Contributor


Сообщения: 5387
Благодарности: 1105

Профиль | Отправить PM | Цитировать


Цитата котвася:
Так что думаю тут без * никак так как надо передавать массив. Или есть другой "правильный путь"? »
Для работы со строками нужно использовать классы строковых контейнеров. Управляться с "символьными массивами" под силу только профессионалам, ибо там легко допустить ошибку,*которая сделает программу неработоспособной.


Код: Выделить весь код
#include <strings.h>

class Date
{
public:
	Date (int, const string &, int);
	Date(int, int);
	Date(int, int, int);
	
	void print() const;
	void printChar() const;
	void setDate(int, int, int);
private:
	int Fday;
	int Fmonth;
	string Fsmonth;
	int Fyear;
};


Date::Date(int dd, const string &mm, int yyyy)
{
	Fday = dd;
	year = yyyy;
	Fmonth = mm; // копирование строки выполняется переопределённым оператором класса
}
В Borland C++ Builder для работы со строками обычно используется класс AnsiString
Опять же, нет нужды хранить строковое значение месяца в объекте - ведь названия месяцев известны

-------
Самое совершенное оружие, которым забиты арсеналы богатых и процветающих наций, может легко уничтожить необразованного, больного, бедного и голодного. Но оно не может уничтожить невежество, болезнь, нищету и голод. (Фидель Кастро)

Почему всех осужденных за измену Родине при Сталине реабилитировали при Горбачёве по отсутствию состава преступления? Потому что при Горбачёве измену Родине перестали считать преступлением.

Это сообщение посчитали полезным следующие участники:

Отправлено: 01:45, 21-07-2010 | #12


Аватара для котвася

Пользователь


Сообщения: 147
Благодарности: 5

Профиль | Отправить PM | Цитировать


не знаю, по моему это сложнее, т.к. я до первого додумался первее и сам.
P.S.
в MVS надо использовать <string>

Отправлено: 23:20, 24-07-2010 | #13



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Перегрузка констуктора

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Перегрузка сервера. oIo_DeN_oIo Хочу все знать 6 21-05-2009 10:19
C/C++ - Перегрузка операторов 'operator []' ganselo Программирование и базы данных 3 29-03-2009 14:57
Внезапная перегрузка компа lirer Хочу все знать 8 07-09-2008 14:18
Перегрузка ЦП от небольших программ Sanchovy Непонятные проблемы с Железом 15 29-11-2007 10:42
Перегрузка Rom K Хочу все знать 31 16-10-2002 02:41




 
Переход