Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Для новичков > Перегрузка конструктора |
Автор: Christoph 11.3.2008, 21:33 | ||
Вот задание...Написать программу, которая реализовывала библиотечный каталог. Программа должна запрашивать название книги, автора,год издания,цену и выдавать общее количество книг,общую стоимость,названия книг,которые дороже определнной суммы. В этой программе должен быть создан класс, в котором используется перегружаемые конструкторы.
Вот вопрос...если я задал в конструкторе, фамилию Перепёлка, почему запрашивает это значение? При выводе это фамилия не выводится. А до второго объекта не доходит дело...не запрашивает ничего...Подскажите что можно тут сделать? |
Автор: korian 11.3.2008, 21:47 |
для начала отформатируйте текст кода. читать такое нереально. |
Автор: Christoph 11.3.2008, 21:58 |
А вроде понятно, за что отвечает каждая переменная ![]() |
Автор: korian 11.3.2008, 22:16 | ||
форматирование и написание комментариев, разные операции. ладно, делать серавно нефиг... вот то, что я от вас просил:
щас поизучаю, мож че подскажу. |
Автор: Christoph 11.3.2008, 22:25 |
можно на ты ![]() ![]() |
Автор: bsa 11.3.2008, 23:12 | ||||
Christoph, это не люди капризные. Просто разобрать неформатированный код (особенно чужой) очень непростая задача. А правильно форматировать его в школах/колледжах/ВУЗах почему-то не учат.
замени на:
|
Автор: Christoph 11.3.2008, 23:22 |
Результат тот же....Не выводит мне вконце фамилию Перепёлка...и не доходит до объекта x2. И почему в scanf, kniga[i] и avatar[i]. без & А зачем писать fflush(NULL), если мы значения вводим через пробел? |
Автор: korian 11.3.2008, 23:38 |
проблема в том, что я тебе ничего не должен ![]() поэтому... для того, чтобы получить ответ, надо представить данные так, чтобы они были удобно читаемые и всем понятны. из всех людей, разбирать то, что ты написал будет всего 1% начавших читать данный топик. т.к. у людей, обычно, лишнего времени нету. а если и есть, то им меньше всего хочеться тратить его на форматирование чужого текста. http://forum.vingrad.ru/forum/topic-48015.html - тут вообщем-то все по этому поводу написано. по поводу проблемы... в шутку, можна сказать, что проблема в ДНК ![]() 1) не понимание языка, особенно того, что касается указателей / массивов / конструкторов. 2) не понимание проблемы/задачи. задача не была формализована до того, как начать что либо писать. для начала: мы пишем на объектно-ориентированном языке C++, поэтому желательно отказаться от использования конструкций, которые остались для совместимости с языком C. Это правда сделать достаточно трудно, особенно если учесть, что преподают обычно C и C++ в виде одного курса и преподаватель зачастую сам не понимает различия между языками. В данном примере отказаться от printf/scanf в пользу cout/cin. (еще раз скажу, что это желательно, а не обязательно). далее: bibl::bibl(char* Pisatel) { for(int i=0;i<5;i++) strcpy(avtar[i],Pisatel); } не знаю что ты этим хотел добиться, но врядли оно делает, то что ты хотел. функция strcpy копирует символы из одного массива символов в другой. начнем с того, что char avtar[50][5]; надо заменить на char avtar[5][50]; чтобы приблизить хоть чучуть к тому что будет работать. char avtar[5][50] - с одной стороны это двумерный массив символов, с другой - 5 строк, в каждой не больше 49 символов (один символ уходит для обозначения конца строки) в конструкторе bibl::bibl(char* Pisatel), ты забиешь все 5 строк значением из Pisatel. смысла я в этом не вижу. то же самое относиться и к bibl::bibl(int izd). bibl::~bibl() { for (int i=0;i<5;i++) { strcpy(avtar[i],NULL); izdanie[i]=NULL; } } вызов strcpy(avtar[i],NULL); будет давать 100% ошибку о запрещенном доступе к памяти. делаеться попытка скопировать массив символов в avtar[i] с адреса NULL. izdanie[i]=NULL - в данном случае смысла не имеет. и вообще весь деструктор смысла не имеет. это по поводу 1) не понимание языка, особенно того, что касается указателей / массивов / конструкторов. щас напишу по поводу 2) и вообще как это все должно было быть. |
Автор: bsa 11.3.2008, 23:49 |
документацию на fflush почитай, тогда поймешь, зачем он нужен. Хотя, и без него работает ![]() Насчет параметров scanf, похоже, я погорячился. & там нужен. Деструктор у тебя вызывает access violation (segmentation fault). Нельзя strcpy в качестве параметра передавать NULL. И вообще, лучше убрать этот деструктор - он не нужен, так как динамическая память не используется. Я его убрал и у меня дошло до второго этапа (дальше не пробовал). твоя перепелка затирается операцией scanf. Смысл ее передавать конструктору вообще непонятен. #include<conio.h> - лишняя строка. В конце строк отчета ставь \n, потому что весь вывод идет в одну строку - нечитабельно |
Автор: Christoph 12.3.2008, 00:41 | ||
Я думал что этот код, обнуляет массив... Убрал деструктор....всёравно не хочет....как вроде бы не видит конструктора |
Автор: bsa 12.3.2008, 00:58 |
Christoph, ты вообще прочитал, что тебе написали? Или только про деструктор? Не видит конструктора? Пройдись отладчиков, увидишь, где затык. |
Автор: Christoph 12.3.2008, 01:01 |
korian, такое задание перегрузить конструкторы.... прочитал исправил...всёравно не работает |
Автор: bsa 12.3.2008, 01:15 |
Тебе на этой конкретной задаче надо перегрузить или вообще - написать программ с классом и перегруженными конструкторами? Если так, то лучше это делать на примере класса а-ля string. Один конструктор дефолтный, второй создает строку из си-строки (параметр const char*), третий - конструктор копирования (параметр const string &). Вот хороший и простой в реализации пример. |
Автор: Christoph 12.3.2008, 01:25 |
На конкретной задаче....внимательно читаем условие ![]() |
Автор: bsa 12.3.2008, 11:53 | ||
Почему тегом "код" не пользовался? ![]() |
Автор: korian 12.3.2008, 14:27 |
потому, что это "писалось на бумаге" ![]() а в конце, код ![]() |
Автор: Christoph 12.3.2008, 17:34 |
Млин....код большой....тяжело разобрать,всмысле то что многое не понимаю :(....спасибо конечно за старания, сейчас попробую разобрать |