|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Перегрузка констуктора |
|
|
C/C++ - Перегрузка констуктора
|
Пользователь Сообщения: 147 |
Профиль | Отправить 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
|
Профиль | Отправить PM | Цитировать |
Отправлено: 22:31, 15-07-2010 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 147
|
Профиль | Отправить PM | Цитировать хо хо хо сам решил!
вот: |
Отправлено: 01:02, 16-07-2010 | #3 |
ИО Капитана Очевидности Сообщения: 5387
|
Профиль | Отправить PM | Цитировать Цитата котвася:
Представь,*что дальше в тексте программы будет команда на освобождение области памяти, на которую указывает mm. Тогда попытка обратиться к _month приведёт к ошибке. И вообще, использовать char* нельзя. Для работы с текстом нужно объявлять объекты строковых контейнеров (string, AnsiString и т.д.) |
|
------- Отправлено: 05:54, 16-07-2010 | #4 |
Пользователь Сообщения: 147
|
Профиль | Отправить PM | Цитировать пример можно?
|
|
Отправлено: 14:22, 16-07-2010 | #5 |
Старожил Сообщения: 281
|
Профиль | Отправить PM | Цитировать Цитата El Scorpio:
Цитата котвася:
|
||
------- Отправлено: 19:40, 16-07-2010 | #6 |
Ветеран Сообщения: 1180
|
Профиль | Отправить 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(); } |
Отправлено: 09:49, 17-07-2010 | #7 |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать pva, Он до этого дойдёт позже. В книге Дейтелов изучение классов начинается с самых простых примеров без проверки на ошибки и только чуть-чуть погодя будут этот класс Time улучшать, добавляя функции проверки, коррекции и т.д.
|
------- Отправлено: 13:53, 17-07-2010 | #8 |
Пользователь Сообщения: 147
|
Профиль | Отправить PM | Цитировать pva, это я догоняю. Мне надо, например, перегрузить вот так: ДАТА(01 01 1900) и ДАТА( 1 января 1900). Не пойму пока как это сделать "правильно".
и вопрос: если написать _hidden_init(); то конструктор перестает быть по умолчанию "встраиваемый" и будет "вызываться"? и что бы он стал inline это надо явно указывать? я правильно понимаю? |
Отправлено: 22:52, 17-07-2010 | #9 |
Пользователь Сообщения: 147
|
Профиль | Отправить 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 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Перегрузка сервера. | 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 |
|