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

Компьютерный форум 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

 

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

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


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

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


ха сам додумался
лишнем было
Код: Выделить весь код
void Date::Date(int dd, int yyyy)
{
	day = dd;
	year = yyyy;
}
и как раз назрело еще два вопроса:
1) Как перегрузить print() что бы она понимала автоматически сколько ей печатать параметров?
2) Как перегрузить Date() c типом char?

Отправлено: 22:31, 15-07-2010 | #2



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

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


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

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


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

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


хо хо хо сам решил!
вот:
Код: Выделить весь код

class Date
{
public:
	Date(int, char *, int);
	Date(int, int);
	Date(int, int, int);
	
	void print() const;
	void printChar() const;
	void setDate(int, int, int);
private:
	int day;
	int month;
	char *_month;
	int year;
};
Date::Date(int dd, char *mm, int yyyy)
{
	day = dd;
	_month = mm;
	year = yyyy;
}

Отправлено: 01:02, 16-07-2010 | #3


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


Contributor


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

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


Цитата котвася:
Date::Date(int dd, char *mm, int yyyy)
{ day = dd; _month = mm; year = yyyy; }
»
Неправильно.
Представь,*что дальше в тексте программы будет команда на освобождение области памяти, на которую указывает mm. Тогда попытка обратиться к _month приведёт к ошибке.

И вообще, использовать char* нельзя. Для работы с текстом нужно объявлять объекты строковых контейнеров (string, AnsiString и т.д.)

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

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


Отправлено: 05:54, 16-07-2010 | #4


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

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


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

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


пример можно?

Отправлено: 14:22, 16-07-2010 | #5


Аватара для Glareone

Старожил


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

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


Цитата El Scorpio:
И вообще, использовать char* нельзя. »
Цитата котвася:
Date::Date(int dd, char *mm, int yyyy)
{ day = dd; _month = mm; year = yyyy; } »
В данном примере, действительно, так лучше не делать.Но вообще, использовать char* не запрещает никто. Просто за выделением памяти mm=new... delete[] mm; самому приходится следить.

-------
Имеющий глаза,да узрит, Имеющий уши,да внемлет.


Отправлено: 19:40, 16-07-2010 | #6

pva pva вне форума

Аватара для pva

Ветеран


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

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


ещё пара советов по оптимизации: исхожу из предположений
1) последовательность уточнения даты: год, месяц, день, час, минута, секунда, либо в обратном порядке. Т.е. нет смысла задавать дату днём и годом (без указания месяца).
2) обратный порядок нужен только для того, чтобы сокращённо задавать промежуток времени (например интервал 1 день 5 секунд). А его лучше задавать количеством секунд, а не датой. Поэтому обратный порядок тоже не нужен.
Код: Выделить весь код
// Таким образом нужен один конструктор:
class Date {
public:
  Date(int year=0, int month=1, int day = 1, int hour=0, int min=0, int sec=0);
  ...
private:
  _hidden_init(); // не раскрывается inline
};

// т..к. по сути мы даём возможность заполнить структуру, то лучше вынести inline
// так мы разделим присвоение параметров (как бы inline) и дальнейшую обработку _hidden_init()
inline Date::Date(...)
{
   ...
   _hidden_init();
}
Если нужно иногда использовать время отдельно от даты, то можно сделать так:
Код: Выделить весь код
// Таким образом нужен один конструктор:
class Time {
public: Time(int h, int m, int s);
};
class Date {
public: Date(int y, int m, int d);
};
class DateTime
{
public:
  DateTime(const Date&, const Time&);
  DateTime(const Date&);
  DateTime(const Time&);
};
// тогда путаницы не возникнет
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:49, 17-07-2010 | #7


Аватара для Drongo

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


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

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


pva, Он до этого дойдёт позже. В книге Дейтелов изучение классов начинается с самых простых примеров без проверки на ошибки и только чуть-чуть погодя будут этот класс Time улучшать, добавляя функции проверки, коррекции и т.д.

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
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


Отправлено: 13:53, 17-07-2010 | #8


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

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


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

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


pva, это я догоняю. Мне надо, например, перегрузить вот так: ДАТА(01 01 1900) и ДАТА( 1 января 1900). Не пойму пока как это сделать "правильно".
и вопрос:
если написать _hidden_init(); то конструктор перестает быть по умолчанию "встраиваемый" и будет "вызываться"?
и что бы он стал inline это надо явно указывать? я правильно понимаю?

Отправлено: 22:52, 17-07-2010 | #9


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

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


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

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


Нашел такое решение:
Код: Выделить весь код
#include <iostream>
class Date
{
public:
	Date(int, char, int);
	Date(int, int, int);
	
	void print() const;
	void printChar() 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;
}
Date::Date(int dd, char 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::print() const
{
	if(month >= 0)
		std::cout << day << "/" <<  month << "/"  << year << std::endl;
	else
		std::cout << day << "/" << year << std::endl;
}
void Date::printChar() const
{
	std::cout << day << "/" <<  char(month) << "/"  << year << std::endl;
}

int main()
{
	setlocale(LC_ALL,".1251");
	char _month[]="январь";
	Date d(2,12,2000);
	std::cout << _month[0] << std::endl;
	Date d3(1, _month[0],1991);

	d.print();
	d3.printChar();

	system("pause");
	return 0;
}
только вот одна проблема:
в Date могу передать только одну букву названия месяца.
Так что думаю тут без * никак так как надо передавать массив. Или есть другой "правильный путь"?

Отправлено: 23:29, 17-07-2010 | #10



Компьютерный форум 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




 
Переход