cin cout variables???
6 отговора
198 прегледа
cin cout variables???
така
уча се начи на стл и ц++ едновременно
та се опитвам да направа променлива която да се вижда от сякаде си като вклуча хеадер филе-а несто като цин и цоут (не сам сигурен че са точно променливи но имам известни подозрения)
та вапроса ми е как става това нещо?
ако си я дефинирам в хеадер-а компилатора ми казва че имало мултипле инстанси
ако я дефинирам като екстерн(цин и цоут са такива доколкото разгледах) ми казва че не можел да намери дефинициа
и в двата случая сам сагласен с компилатора та как се прави това нещо?
бонус вапрос защо стд::ендл е дефиниран като функциа а се ползва без () отзаде
мерси за помощта
уча се начи на стл и ц++ едновременно
та се опитвам да направа променлива която да се вижда от сякаде си като вклуча хеадер филе-а несто като цин и цоут (не сам сигурен че са точно променливи но имам известни подозрения)
та вапроса ми е как става това нещо?
ако си я дефинирам в хеадер-а компилатора ми казва че имало мултипле инстанси
ако я дефинирам като екстерн(цин и цоут са такива доколкото разгледах) ми казва че не можел да намери дефинициа
и в двата случая сам сагласен с компилатора та как се прави това нещо?
бонус вапрос защо стд::ендл е дефиниран като функциа а се ползва без () отзаде
мерси за помощта
Re: cin cout variables???
<забележка тип="полусериозна">
По принцип не се заяждам за такива работи, защото е тъпо, ама при теб отдавна ми прави впечатление и вече ми се превръща във фикс идея. В българския има и букви Ъ и Я.
</забележка>
цин и цоут наистина са променливи.
Декларацията на променливата и нейното създаване (дефиниция) са различни работи. Значи трябва ти да дефинираш променливата, която компилатора да знае как да създаде. На местата където ще я използваш трябва да декларираш, че се интересуваш от променливата и да кажеш на компилатора да не те бие през ръцете защото дефиницията не е в същия файл.
Давам пример с глобален инт, който искаш да ползваш на няколко места.
1) дефинираш променливата в някой .cpp файл.
int myVar = 3;
Жизнено важно е да не е в хедър, който се #инцлуде някъде. Препроцесора просто глупаво вмъква текста все едно си го копирал и пейстнал -- оттам и оплакванията на компилатора за многото дефиниции.
2) във файла, който искаш да я използва трябва да обявиш, че променливата е дефинирана другаде.
extern int myVar;
Така компилатора ще знае, че дефиницията ще дойде от друго място. Най-вероятно ти си изпуснал стъпка 1 в твоя опит. Напляскал ("казва че не можел да намери дефинициа" ) те е не компилатора, а линкера, който е тръгнал да сглобява обектните файлове. Намерил е опити да се използва променлива, но не е намерил нейната дефиниция.
3) това е вече изгъзица -- extern декларацията от стъпка 2 можеш да я сложиш в хедър и да не я пишеш навсякъде където вече инклудваш хедъра.
Нямам подръка дефиницията на ендл, но съм около 97.42% сигурен, че не е функция. Функциите в Ц++ не могат да имат овърлоаднати оператори за << и >>.
--
"Agile is a mindset, not a set of practices, rules, or tools."
Tom Poppendieck
По принцип не се заяждам за такива работи, защото е тъпо, ама при теб отдавна ми прави впечатление и вече ми се превръща във фикс идея. В българския има и букви Ъ и Я.
</забележка>
цин и цоут наистина са променливи.
Декларацията на променливата и нейното създаване (дефиниция) са различни работи. Значи трябва ти да дефинираш променливата, която компилатора да знае как да създаде. На местата където ще я използваш трябва да декларираш, че се интересуваш от променливата и да кажеш на компилатора да не те бие през ръцете защото дефиницията не е в същия файл.
Давам пример с глобален инт, който искаш да ползваш на няколко места.
1) дефинираш променливата в някой .cpp файл.
int myVar = 3;
Жизнено важно е да не е в хедър, който се #инцлуде някъде. Препроцесора просто глупаво вмъква текста все едно си го копирал и пейстнал -- оттам и оплакванията на компилатора за многото дефиниции.
2) във файла, който искаш да я използва трябва да обявиш, че променливата е дефинирана другаде.
extern int myVar;
Така компилатора ще знае, че дефиницията ще дойде от друго място. Най-вероятно ти си изпуснал стъпка 1 в твоя опит. Напляскал ("казва че не можел да намери дефинициа" ) те е не компилатора, а линкера, който е тръгнал да сглобява обектните файлове. Намерил е опити да се използва променлива, но не е намерил нейната дефиниция.
3) това е вече изгъзица -- extern декларацията от стъпка 2 можеш да я сложиш в хедър и да не я пишеш навсякъде където вече инклудваш хедъра.
В отговор на:бонус вапрос защо стд::ендл е дефиниран като функциа а се ползва без () отзаде
Нямам подръка дефиницията на ендл, но съм около 97.42% сигурен, че не е функция. Функциите в Ц++ не могат да имат овърлоаднати оператори за << и >>.
--
"Agile is a mindset, not a set of practices, rules, or tools."
Tom Poppendieck
Re: cin cout variables???
еби Ъ-то и Я-то ас така от малак си пишем
та сега за сериозните неща тва хубаво че ми го каза но не ми обяснява как така като си инклудна на 5(пет) места иостреам.х-а (или там както се казва тоя фаил ) никаде не си пиша вав сорцето остреам цин (един вид дефинициа да си праим) а па си го ползвам без проблеми
за бонус-а
бцц 5 и нещо си
остреам.х
template<class charT, class traits>
inline basic_ostream<charT, traits>&
endl(basic_ostream<charT, traits>& os)
{
os.put( charT('\n') );
os.flush();
return os;
}
<забележка тип="полусериозна">
не сам чак толко тап на колкото се праим
</забележка>
та сега за сериозните неща тва хубаво че ми го каза но не ми обяснява как така като си инклудна на 5(пет) места иостреам.х-а (или там както се казва тоя фаил ) никаде не си пиша вав сорцето остреам цин (един вид дефинициа да си праим) а па си го ползвам без проблеми
за бонус-а
бцц 5 и нещо си
остреам.х
template<class charT, class traits>
inline basic_ostream<charT, traits>&
endl(basic_ostream<charT, traits>& os)
{
os.put( charT('\n') );
os.flush();
return os;
}
<забележка тип="полусериозна">
не сам чак толко тап на колкото се праим
</забележка>
Re: cin cout variables???
В отговор на:бонус вапрос защо стд::ендл е дефиниран като функциа а се ползва без () отзаде
std::endl e ostream манипулатор, а манипулаторите са функции. Има предефиниран operator<<, който приема като втори аргумент адреса на функция от манипулаторен тип. Нещо такова:
ostream& ostream::operator << ( ostream& (*op) (ostream&)) ...
Re: cin cout variables???
Круме, като гледам имаш проблеми не с iostream-ове, а със препроцесора, линкера и обявите на extern променливи... Вземи прочети някоя книжка по въпроса или пробвай в MSDN-а.
Като начало:
1) "заграждай" хедара с #ifndef ... #endif т.е.
#ifndef _MY_HEADER_NAME_
#define _MY_HEADER_NAME_ // _MY_HEADER_NAME_ трябва да е уникално!
//тука сложи съдържанието на хедъра....
#endif
Така ще може да инклудваш хедъра колкото си пъти искаш. И няма да имаш проблеми с многократнo повтарящи се декларации.
Същия ефект може да се постигне и с #pragma once (казват че ускорява препроцесването т.е. компилиратнето), но небило много преносимо между различните платформи(компилатори/препроцесори)...
2) в хедъра (както вече отбеляза Дешев) пишеш декларациите на променливите т.е.
extern int MyNumber;
3) в някое cpp я дефинираш твоята си променлива т.е.
int MyNumber;
ако искаш може и да я инициализираш (препоръчително е) т.е. пишеш
int MyNumber=10;
Гледай да я дефинираш само в едино cpp, че линкера ще се шашне и ще ти се кара.
Като начало:
1) "заграждай" хедара с #ifndef ... #endif т.е.
#ifndef _MY_HEADER_NAME_
#define _MY_HEADER_NAME_ // _MY_HEADER_NAME_ трябва да е уникално!
//тука сложи съдържанието на хедъра....
#endif
Така ще може да инклудваш хедъра колкото си пъти искаш. И няма да имаш проблеми с многократнo повтарящи се декларации.
Същия ефект може да се постигне и с #pragma once (казват че ускорява препроцесването т.е. компилиратнето), но небило много преносимо между различните платформи(компилатори/препроцесори)...
2) в хедъра (както вече отбеляза Дешев) пишеш декларациите на променливите т.е.
extern int MyNumber;
3) в някое cpp я дефинираш твоята си променлива т.е.
int MyNumber;
ако искаш може и да я инициализираш (препоръчително е) т.е. пишеш
int MyNumber=10;
Гледай да я дефинираш само в едино cpp, че линкера ще се шашне и ще ти се кара.