Титла: Как да си създам мой собствен .h файл в С++ ? Публикувано от: mazzzterZ в Mar 21, 2009, 17:36 Здравейте !
Искам да питам как да създам свой собствен .h файл и или ако някой може да ми даде линк към някое подробно описание на стъпките които трябва да следвам, защото от това което намерих из гугле нищо не можа да ми свърши работа практически. Титла: Re: Как да си създам мой собствен .h файл в С++ ? Публикувано от: victim70 в Mar 21, 2009, 17:52 Прочети тази книжка първо ;D
http://www.dummies.com/store/product/C-For-Dummies-5th-Edition.productCd-0764568523.html ($2) Титла: Re: Как да си създам мой собствен .h файл в С++ ? Публикувано от: mazzzterZ в Mar 21, 2009, 18:11 А някакъв вариант, който да не ми струва пари ?
Аз вече съм прочел книгата на Хърб Шилдт, но там никаде не се споменаваше за хедър файлове. Титла: Re: Как да си създам мой собствен .h файл в С++ ? Публикувано от: Ivshti в Mar 21, 2009, 18:37 Хедър файловете ползват абсолютно същия синтакс като другите.
Ако не си зубрил, би трябвало да се справиш. Хедърите се ползват (обикновено) за предварително дефиниране на някой работи. Титла: Re: Как да си създам мой собствен .h файл в С++ ? Публикувано от: mazzzterZ в Mar 21, 2009, 18:41 Хедър файловете ползват абсолютно същия синтакс като другите. Ми както казах в книгата не бяхс засегнати изобщо. Иначе от това, което научих в хедър файловете си извиквам функциите, а в друг файл cpp си пиша какво правят функциите и после, като в този файл добавям хеъд файла в който се извиква. А във файла в който ми е main си извиквам моят хедър заграден в кавички. Но акто направя това пак не става. Например в този файл в който съм си описал функциите ми казва, че му е непознато cout и cin, а аз съм включил хедъра iostream. Затова питам, ако има някаде подробен туториал да видя какво изпускам. Титла: Re: Как да си създам мой собствен .h файл в С++ ? Публикувано от: victim70 в Mar 21, 2009, 19:35 Дай си конкретния пример и ще го коментираме. Но за да имаш собствен хедър трябва да имаш (в повечето случаи) програма от два С файла.
За книжките и парите имаш богат избор. Има разхвърляни ръководства в нета но си на такова ниво че няма да разбереш как да ги ползваш и да ги систематизираш. Може да се получи така че да пишеш нещо без да знаеш основата (това доста често се наблюдава). Не бъди скъперник ако искаш да получиш първо трябва да дадеш. В книжарницата ти предлагам да минеш и да прегледаш книгите, да ги пипнеш, и прегледаш. Която ти хареса (разбира се да е за абсолютно начинаещ) взимаш я и почваш систематично да четеш и да правиш примерите. Примерите се правят задължително с минимум 3 вариации по темата. Книгите обикновенно са написани от хора които знаят какво ти е нужно и е систематизирано не се скъпи за няколкото левчета дето ще им дадеш вместо да ги изконсумираш на кафета алкохоли или подобни. Така че чети. Избери си добре преведени на български книги за да не хабиш сили в превод и да се съсредоточиш на основното - програмирането. От мене - имай търпение и кураж ще ти е необходимо ако се занимаваш сериозно - не се обезкуражавай от глупави коментари - много 'умници' забравят че и те са тръгнали от там дето и ти. Дай Боже повече такива като тебе - с желание да научат нещо ново. Приятно копаене Титла: Re: Как да си създам мой собствен .h файл в С++ ? Публикувано от: mazzzterZ в Mar 21, 2009, 19:39 Код: #include<iostream> Това е задачата ми. Целта ми е в главният файл да имам само main програмата. Всичко друго искам да го вмъкна в хедър. Щях да забравя. Значи имам още един проблем. Когато с cin.getline() въведа нещо за втори път то не ме чака,а направо ми записва празно поле или нов ред не съм сигурен. Това успях да го избегна с глобалната променлива test, но е много дървено и не ми харесва. А това за книгите не, че не искам да си копувам, книги, но в момента нямам пари да харча за такива неща. Е то може и да има, но се влагат в други неща(споко не е алкохол, аз не пия алкхолни напитки). Титла: Re: Как да си създам мой собствен .h файл в С++ ? Публикувано от: victim70 в Mar 21, 2009, 20:57 Брей цццц не е съвсем за начинаещи кода :) .
Нормално както казах малки пропуски в основата за да не бишнеш сградате хвани малко С първо да погледнеш. Ето го решението Хедъра който се казва classes.h #ifndef MYCLASS__HH #define MYCLASS__HH //това проверява дали е включен вече веднъж хедъра // не го забравай да слагаш подобно нещо в бъдеще #include<iostream> #include<cstring> #include<typeinfo> #include<new> #include<strstream> int test=0; using namespace std; template<class TMP> TMP *dyn_save(TMP *temp, int length=0); //Classes_begin................................................................. class library { public: virtual void f() {} }; class book : public library { public: ~book() { delete name; delete year; cout << "Destructing Book !!!" << endl; } char *name; int *year; int enter_info(); }; class item { public: ~item() { cout << "Destructing Node !" << endl; } library *pData; item *pNext; }; class stack { item *top; public: ~stack() { cout << "Destructing Stack !" << endl; } stack() { top = NULL; } void push(library *obj); item *pop(); }; class message { public: void enter_name(char *temp); void enter_year(int *temp); char *enter_book(); }; class error { public: char *memory_error(); }; //Classes_end................................................................... bool yes_or_no(char *x); #endif //Край на хедъра това ти е С файла не забравай разширението .cpp Аз го кръстих mycode.cpp #include "classes.h" template<class TMP> TMP *dyn_save(TMP *temp, int length=0) { TMP *mem; try { if(length){ if(typeid(*temp) == typeid(char)) { mem = new TMP[length+1]; if(temp!=NULL) memcpy(mem, temp, length+1); } else { mem = new TMP[length]; if(temp!=NULL) memcpy(mem, temp, (sizeof(temp[0])*length)); } } else { mem = new TMP; if(temp!=NULL) *mem = *temp; } } catch(bad_alloc x) { return NULL; } return mem; } //Class_Functions_begin......................................................... int book::enter_info() { char *temps=NULL; int *tempi=NULL; temps = dyn_save(temps, 1000); if(temps==NULL) return -1; tempi = dyn_save(tempi); message msg; msg.enter_name(temps); this->name = dyn_save(temps, strlen(temps)); delete []temps; msg.enter_year(tempi); this->year = dyn_save(tempi); delete tempi; return 0; } void stack::push(library *obj) { item *node=NULL; node = dyn_save(node); node->pData = obj; node->pNext = top; top = node; } item *stack::pop() { book *pBook; item *temp; pBook = dynamic_cast<book *> (top->pData); cout << "Name: " << pBook->name; cout << endl; cout << "Year: " << *(pBook->year); cout << endl; delete pBook; temp = top; top = top->pNext; delete temp; return top; } void message::enter_name(char *temp) { bool correct; char *c; //........................................ if(test==1) { cin.getline(temp,1000); } test = 1; //........................................ do { correct = true; cout << "Enter a name: "; cin.getline(temp,1000); for(c=temp; *c!='\0'; c++) if(!((*c>='a' && *c<='z') || (*c>='A' && *c<='Z') || *c=='\"' || *c=='.' || *c=='\\' || *c==' ')) { correct = false; break; } } while(correct==false); } void message::enter_year(int *temp) { do { cout << "Enter a year: "; cin >> *temp; } while(*temp<0 || *temp>2009); } char *message::enter_book() { char buf[1000]; ostrstream msg(buf, sizeof(buf)); msg << "Would you like to enter a book ? "; msg << '\0'; char *temp; temp = dyn_save(buf, strlen(buf)); return temp; } char *error::memory_error() { char buf[1000]; ostrstream err(buf, sizeof(buf)); err << "There isn't enough memory available!" << endl; err << "Free more memory if you would like to continue ? y/n: "; err << '\0'; char *temp; temp = dyn_save(buf, strlen(buf)); return temp; } //Class_Functions_end........................................................... //Main_Functions_begin.......................................................... int main() { book *Book=NULL; stack *stk=NULL; stk = dyn_save(stk); message *msg=NULL; msg = dyn_save(msg); error *err=NULL; err = dyn_save(err); int no_mem; do { begin: //This is used by goto. Book = dyn_save(Book); no_mem = Book->enter_info(); if(no_mem==-1) { if(yes_or_no(err->memory_error())==false) break; else goto begin; } stk->push(Book); cout << flush; } while(yes_or_no(msg->enter_book())==true); cout << endl; while(stk->pop()!=NULL) cout << endl; delete stk; cout << "Sucess !"; return 0; } //Main_Functions_end............................................................ //Functions..................................................................... bool yes_or_no(char *x) { char y_n; try { cout << x; delete x; cin >> y_n; throw y_n; } catch(char y_n) { if(y_n=='y') return true; else return false; } } Компилира се с командата c++ -o mycode mycode.cpp За cin.getline() го погледни на дебъгера :-) помни последния ентер от клавиатурата - не го обработваш. Това е причината да ти излиза. А за това че е тъпо да ползваш флаг и то глобален - спор няма. Но все пак по добре със флага работещо отколко чисто и неработещо. Няколко забележки: 1. Дава при компилация съобщение за внимание - обърни му внимание и нанеси корекциите (опцията -Wno-deprecated е забранена да я използваш :D ) 2. Използването template<class TMP> не е препоръчително - прави кода по трудно четим. В дадени случаи ако работите повече разработчици времето за откриване на изключения ще е повече от спестеното. 3. try/catch се използват когато много те мързи да провериш изключенията. Вина се базира на многократно повторение на този код. Но по-добре така отколкото без проверка. 4. Елегантно решение if(temps==NULL) return -1; 5. Правилно this->year = dyn_save(tempi); delete tempi; return 0; } Въпреки че живота на указателя tempi е между фигурните скоби (говоря за gcc g++ >2.х.х) по-добре е да се използва (може пък поредната версия да е бъгава кой-знае). 6. Не е коректна проверката има още условия освен това от 0 година едва ли ще вкарваш записи. Съобщението трябва да ти казва и формата на годината за глупави потребители като мене. do { cout << "Enter a year: "; cin >> *temp; } while(*temp<0 || *temp>2009); 7. Глупаво ограничение без проверка char *message::enter_book() { char buf[1000]; Какво става ако вкарам 1001 символа за книга - гърми 8. Същото като 7 ама тука си се презастраховал имаш константни съобщения char *error::memory_error() { char buf[1000]; ostrstream err(buf, sizeof(buf)); 9. Красота book *Book=NULL; 10. Забрави че съществува това в езика С и С++ - използвай структура от типа do{....}while(); Много грозно и не стилно е в структурен език да се ползва goto goto begin; 11. Това да не е пример от С книжка за вин. ??? На такова ми бие. Хубавите книжки не ти препоръчват ОС или начин на компилиране. Нета също така не е книга - всекакви хора има там. Не приемай много присърце коментара, но е добре да го разбереш, това все пак е моя стил. Успех Титла: Re: Как да си създам мой собствен .h файл в С++ ? Публикувано от: mazzzterZ в Mar 21, 2009, 22:03 Много ти благодаря victim70.
1. Да съобщението съм го видял, Цитат #warning This file includes at least one deprecated or antiquated header which may be removed without further notice at a future date. Please use a non-deprecated interface with equivalent functionality instead. For a listing of replacement headers and interfaces, consult the file backward_warning.h. To disable this warning use -Wno-deprecated.|Но да си призная не съм му обърнал много внимание. Даже и ен знам кога се е появило, тъй акто имах проблеми с полифорфизма и даваше много грешки, а аз променях различни неща... няма значение. Ще му обърна внимание. 2. Ще го имам предвид това, но да питам това означавали, че трябва да избягвам и темплейт класове ?(въпреки че в отговара ти имаш предвид изобщо всички темплейти... но все пак да питам). 3. откакто се запознах с try и catch винаги сам се чудил, кое ще е по-бързо. Да използвам изключенията или да да използвам new(nothrow) и после да проверявам за NULL. Също да питам в такива малки заделения на памети за вбъдеще да изпускам ли такива проверки ? Все пак те искат само няколко байта от паметта или е по-добре да си ги оставя, въпреки, че ще мъчат малко повечко процесора. 7. Тука не разбрах какво точно си имал рпедвид. В тази функция имам само константни съобщения, потребителя нищо не вкарва. 10. За goto бях чел, че трябва да се избягва, но ми изглеждаше като анчин да ми е по-чист кода, но да наистина ако някой друг го гледа може да се обърка. Ще го заменя с do{}while() 11. Не това не е пример от книжка. Това е задача от преди 2 месеца, която беше на С(домашна работа в университета)и аз като започнах да изучавам С++ почнах да я надграждам постепенно с новите неща, които научавам и се стигна до тука. Книгата май не препоръчва операционна система или поне аз не съм забелязал, но откакто съм на линукс не мога да не призная, че линукса ми е като среда, която съм приел твърдо за програмиране Пак много благодаря за помоща и бързият отговор. ;D П.П. Само да питам има ли вариант функциите ме да отидат в друг файл и когато викна хедъра, той да си ги вика от другият файл ? Титла: Re: Как да си създам мой собствен .h файл в С++ ? Публикувано от: gat3way в Mar 21, 2009, 22:27 gcc file1.c file2.c file3.c ..... -o executable
Титла: Re: Как да си създам мой собствен .h файл в С++ ? Публикувано от: Emooo в Mar 21, 2009, 22:37 Цитат 2. Използването template<class TMP> не е препоръчително - прави кода по трудно четим. В дадени случаи ако работите повече разработчици времето за откриване на изключения ще е повече от спестеното. WTF?.... WTF?! Титла: Re: Как да си създам мой собствен .h файл в С++ ? Публикувано от: victim70 в Mar 22, 2009, 01:23 Започвам от послеписа:
1 файл main.cpp #include "classes.h" template<class TMP> TMP *dyn_save(TMP *temp, int length=0) { TMP *mem; try { if(length){ if(typeid(*temp) == typeid(char)) { mem = new TMP[length+1]; if(temp!=NULL) memcpy(mem, temp, length+1); } else { mem = new TMP[length]; if(temp!=NULL) memcpy(mem, temp, (sizeof(temp[0])*length)); } } else { mem = new TMP; if(temp!=NULL) *mem = *temp; } } catch(bad_alloc x) { return NULL; } return mem; } //Main_Functions_begin.......................................................... int main() { book *Book=NULL; stack *stk=NULL; stk = dyn_save(stk); message *msg=NULL; msg = dyn_save(msg); error *err=NULL; err = dyn_save(err); int no_mem; do { begin: //This is used by goto. Book = dyn_save(Book); no_mem = Book->enter_info(); if(no_mem==-1) { if(yes_or_no(err->memory_error())==false) break; else goto begin; } stk->push(Book); cout << flush; } while(yes_or_no(msg->enter_book())==true); cout << endl; while(stk->pop()!=NULL) cout << endl; delete stk; cout << "Sucess !"; return 0; } //Main_Functions_end............................................................ Втори файл classes.cpp #include "classes.h" template<class TMP> TMP *dyn_save(TMP *temp, int length=0) { TMP *mem; try { if(length){ if(typeid(*temp) == typeid(char)) { mem = new TMP[length+1]; if(temp!=NULL) memcpy(mem, temp, length+1); } else { mem = new TMP[length]; if(temp!=NULL) memcpy(mem, temp, (sizeof(temp[0])*length)); } } else { mem = new TMP; if(temp!=NULL) *mem = *temp; } } catch(bad_alloc x) { return NULL; } return mem; } //Class_Functions_begin......................................................... int book::enter_info() { char *temps=NULL; int *tempi=NULL; temps = dyn_save(temps, 1000); if(temps==NULL) return -1; tempi = dyn_save(tempi); message msg; msg.enter_name(temps); this->name = dyn_save(temps, strlen(temps)); delete []temps; msg.enter_year(tempi); this->year = dyn_save(tempi); delete tempi; return 0; } void stack::push(library *obj) { item *node=NULL; node = dyn_save(node); node->pData = obj; node->pNext = top; top = node; } item *stack::pop() { book *pBook; item *temp; pBook = dynamic_cast<book *> (top->pData); cout << "Name: " << pBook->name; cout << endl; cout << "Year: " << *(pBook->year); cout << endl; delete pBook; temp = top; top = top->pNext; delete temp; return top; } void message::enter_name(char *temp) { bool correct; char *c; //........................................ if(test==1) { cin.getline(temp,1000); } test = 1; //........................................ do { correct = true; cout << "Enter a name: "; cin.getline(temp,1000); for(c=temp; *c!='\0'; c++) if(!((*c>='a' && *c<='z') || (*c>='A' && *c<='Z') || *c=='\"' || *c=='.' || *c=='\\' || *c==' ')) { correct = false; break; } } while(correct==false); } void message::enter_year(int *temp) { do { cout << "Enter a year: "; cin >> *temp; } while(*temp<0 || *temp>2009); } char *message::enter_book() { char buf[1000]; ostrstream msg(buf, sizeof(buf)); msg << "Would you like to enter a book ? "; msg << '\0'; char *temp; temp = dyn_save(buf, strlen(buf)); return temp; } char *error::memory_error() { char buf[1000]; ostrstream err(buf, sizeof(buf)); err << "There isn't enough memory available!" << endl; err << "Free more memory if you would like to continue ? y/n: "; err << '\0'; char *temp; temp = dyn_save(buf, strlen(buf)); return temp; } //Class_Functions_end........................................................... //Functions..................................................................... bool yes_or_no(char *x) { char y_n; try { cout << x; delete x; cin >> y_n; throw y_n; } catch(char y_n) { if(y_n=='y') return true; else return false; } } Компилира се само ако е самостоятелно както са казали по нагоре g++ -o program main.cpp classes.cpp Ако трябва да е библиотека малко по различно е компилирането - но за това прочети някой наръчник от нета - в момента е късно и не си спомням точното заклинание са статична и динамична библиотека. За разработка добре ползваш линукс но подкарай една Anjuta или qt-creator, qtdevelop, xemcs + lisp абе някакво IDE зарежи приказките за vi, nano, обикновен редактор или нещо подобно. Нещата могат и лесно да стават. Vi и компания са за хора дето работят с модем на 300 бода и смятат че администрират - направо героизъм в мирно време. Целта е програмирането, а не писането на make файлове или борба с редактора за подреждане и т.н.т. за 7. имам предвид че ако ангажираш още 65 такива масива за кратичко съобщение ще излезнеш от data segment-а прави ги колкото трябва на големина - масивите са подлярска работа. Прочети какво се случва при изпозване на локални масивите http://groups.google.com/group/microdia/browse_thread/thread/eae71fbdb66aa5fa ($2) последното от треда - а не са големи - виж кръпката. за 3. Задай си въпроса какво прави try/catch - ами на всяка операция проверява за маса изключения като делене на нула, използване на неинициялизиран указател, излизане от сегмент, ..... Като го слагаш значи чакаш изключение - фатално за нормално работеща програма без тази структура. Изключенията в общия случай са 2 кофти потребителски вход - тогава понеже сме го обработили за какво да казваме на глупавия потребител какво е сбъркал, да вкарва докато отмалее се ще го нацели - приложението става работещо, но не е приятелски настроено към потребителя. Второто е потенциялна грешка в програмата от липса на проверки. За това нека се направят проверките и всяко изключение (или група) да се обработят както трябва. Не са повече от 5-6 проверки в най тежкия случай. Иначе компилатора прави кода доста по бавен заради проверките. Обаче при работа с хардуер понякога е неминуемо (ATI драйвера) особено като незнаеш какво да очакваш.... А процесора не е мъченик но с try/catch ще го измъчиш леко. За използването на темплейт мини на виртуализация - т.е. да не е експеримент за универсализиране а да си има отделен виртуален клас за int,float,char,... и всички други неща които ще обработва. Просто се опитай да го вкараш този темплейт във classes.cpp като го извадиш от main функцията. Изглежда просто и логично да стане. Да ама не. Или да го дебъгваш с вътрешна за него точка на прекъсване. Тогава е малко по сложно да разбереш от къде го викаш. Това копиране ще работи добре само в твоя или близък случай. Описано е защо да се ползват виртуални класове, а не по този начин в един много ценен наръчник 'С++ на разбираем език' . Защо ли този така изглеждащо 'универсален' код го няма в стандартните библиотеки? Титла: Re: Как да си създам мой собствен .h файл в С++ ? Публикувано от: Emooo в Mar 22, 2009, 13:22 Цитат 3. Задай си въпроса какво прави try/catch - ами на всяка операция проверява за маса изключения като делене на нула, използване на неинициялизиран указател, излизане от сегмент, ..... Никога не чети книги като 'С++ на разбираем език' и 'С++ for dummies'. Това е убида към самия тебе. Чесно казано трудно разбирам какво си изкал да кажеш много неразбираемо си го написъл. От това което виждам разбирам че според тебе try/catch е нещо лошо и трябва да се избягва. Ако е така това е поредната глупост. Нямам да коментирам защо. Иначе момчето ползва неправилно try/catch във фунцията bool yes_or_no(char *x) там един обикновен if ще свърши същата работа. Сега за темплейтите пак от твойте думи се разбира че темплейтите са нещо което е лошо и трябва да се избягва. Грешно. По добро нещо от темплейтите няма когато гониш скорост на изпълнение на кода. Ползването на темплейта за фунцията dyn_save може да се отимизира но да се ползва наследяване и виртуални фунции в случая е глупаво. Проблем на момчето е типа char затова са тези грозни typeid-ta. Точно тука е силата на темплейта ще замени тази runtime проверка която е бавна с compile time проверка като използва template specialization. Ще стане така #include "classes.h" template<class TMP> TMP *dyn_save(TMP *temp, int length=0) { TMP *mem; try { if(length){ mem = new TMP[length]; if(temp!=NULL) memcpy(mem, temp, (sizeof(temp[0])*length)); } } else { mem = new TMP; if(temp!=NULL) *mem = *temp; } } catch(bad_alloc x) { return NULL; } return mem; } template<> char*dyn_save(char*temp, int length=0) { char *mem; try { if(length){ mem = new char[length+1]; if(temp!=NULL) memcpy(mem, temp, length+1); } else { mem = new char; if(temp!=NULL) *mem = *temp; } } catch(bad_alloc x) { return NULL; } return mem; } Още за темплейтите. Нормалните прогамисти не пишат темплейти в .cpp файл, защото трябва да се прави template instancing ръчно за всеки класс. Затова темплейтите се пишат в .h файлове. Дебугването на темплейти не е никакъв проблем ако ползваш добър дебъгер а не някакъв фрее опен соурс буклук. Титла: Re: Как да си създам мой собствен .h файл в С++ ? Публикувано от: victim70 в Mar 22, 2009, 14:47 Неговия темплейт позволява да се задели място за съответния тип данни (работи и с float и структура, int,long,double,class) точно заради тази неопределеност на входно/изходни-те данни темплайта е мощен инструмент .
В другия случай единствения тип данни който приема и връща е char. В случай че е char не е необходима тази проверка а единственно дали е заделило място. На практика ако махнеш template пак ще работи като копираща функция. Примера не е коректен за темплейт. Ами ако иска и цена да вкара? Как ще работи това char*dyn_save(char*temp, int length=0) с float параметър за temp и какво ще върне. И в двата случая не е необходима (според мене) try/catch защото проверките според мене са достатъчни (може и да не съм прав). Това което не харесвам на този неопределен тип е, че е страшно гъвкав и при неправилно написване, използване (като един мощен инструмент) върши огромни глупости които трудно се откриват и оправят. Това все пак е въпрос на стил на писане. Emoo изложи си детайлно предложението, защото май само аз се отзовах да помогна колкото мога, без да се впечатлявам че незнае как се прави нещо елементарно като хедър и как се компилират няколко файла. Опитах се да изразя моето виждане и моя стил в възможно по кратък пост. Знам че не ме бива в обясненията. И за дебъгера съм полу съгласен - почти не ползвам от 15 години дебъгер. Ползвам ламерският начин с контролни принтове - поне не ме лъжат с времето както го прави дебъгера (пиша повече за хардуер където събитията не позволяват дебъгване). А за книгите е свобода на избора - аз само препоръчвам - поне от моята практика с курсове за ученици (5 курса само съм водил) тези книги са се възприемали много лесно, и идеите са дадени на много лесен и разбираем (достъпен) език (който аз немога да го достигна). try/catch не ги отричам тотално, както и goto само казвам че в примера не са необходими. Ако се ограничи максимално използването им, кода става по чист. Все пак са си част от езика и са необходими на някои места. Пример за използване: имаш хардуерно устройство, което ти връща около 20-30 регистъра, трабва да разделиш число на върнатата стойност. Вместо да правиш 20-30 или повече сравнения за делене на 0, при условие че регистрите немогат да са 0, в този случай е по добре да използваш критична секция try/catch, за да можеш при хардуерен проблем да реагираш адекватно. Титла: Re: Как да си създам мой собствен .h файл в С++ ? Публикувано от: Emooo в Mar 22, 2009, 15:04 Браво за това че си отделил толкова време да отговориш на момчето, няма много хора като тебе в този форум. Мойте забележки бяха на твоя отговор защото не изкам да остане с впечатление че темплейтите и ексепшаните са лошо нещо, защото от това което беше написъл си мислех че говориш по принцип а не в конкеретния случай. Няма да споря по конкретния случай, има различни решения пък и не съм се задълбочавал да го чета само темплейтната функция му хвана окото с това typeid. Препоръчвам книга за C++ "Thinking in C++" by Bruce Eckel, това тука след като научищ книгата http://www.parashift.com/c++-faq-lite/ и за десерт след като вече знаеш много за С++ "Effective C++".
Титла: Re: Как да си създам мой собствен .h файл в С++ ? Публикувано от: victim70 в Mar 22, 2009, 15:25 И една добавка как се прави библиотека, че вчера по нощите не се сещах за 'заклинанието', е намерих го добре описано.
http://www.linux.org/docs/ldp/howto/Program-Library-HOWTO/introduction.html ($2) Титла: Re: Как да си създам мой собствен .h файл в С++ ? Публикувано от: mazzzterZ в Mar 23, 2009, 11:33 Благодаря за помоща ;D. Честно казано, не вярвах, че ще получа толкова подробни отговори, за което ти благодаря victim70 и за критиките към сорса също. Така поне ще знам на какво да наблягам в бъдеще и как да пиша. Това за библиотеките, ще ми е от полза също. Честно казано идеята ми да искам да си направя собствен хедър файл дойде зареди темплейт функцията ми dyn_save(). След като видях колко писане ми спестява, реших, че ако си имам хедър файл, който я съдържа ще мога да си я ползвам за всички програми, които ще пиша занапред( е разбирасе, ще го редактирам както Emooo предложи, бях забравил, че могат да се предефинират и универсалните функции ;D)
Emooo мерси и за книгите, които си препоръчал. Тъкмо сега се чудих мислих каква книга да започна, а не исках да започвам от самото начало с друга книга(може и да имам малки пропуски в основните неща, но съм сигурен, че с главоболия и гугле ще се изчистят) |