cin cout variables???

6 отговора 198 прегледа
#1

cin cout variables???

така
уча се начи на стл и ц++ едновременно
та се опитвам да направа променлива която да се вижда от сякаде си като вклуча хеадер филе-а несто като цин и цоут (не сам сигурен че са точно променливи но имам известни подозрения)
та вапроса ми е как става това нещо?
ако си я дефинирам в хеадер-а компилатора ми казва че имало мултипле инстанси
ако я дефинирам като екстерн(цин и цоут са такива доколкото разгледах) ми казва че не можел да намери дефинициа

и в двата случая сам сагласен с компилатора та как се прави това нещо?

бонус вапрос защо стд::ендл е дефиниран като функциа а се ползва без () отзаде



мерси за помощта

Отговор
в отговор на KpyM #2

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
Отговор
в отговор на Дeшeв #3

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;
}
<забележка тип="полусериозна">
не сам чак толко тап на колкото се праим
</забележка>

Отговор
в отговор на KpyM #4

Re: да грешка

за cin забравих за библиотеките които се линкват сас иострема

Отговор
в отговор на KpyM #5

Re: cin cout variables???

В отговор на:

бонус вапрос защо стд::ендл е дефиниран като функциа а се ползва без () отзаде




std::endl e ostream манипулатор, а манипулаторите са функции. Има предефиниран operator<<, който приема като втори аргумент адреса на функция от манипулаторен тип. Нещо такова:

ostream& ostream::operator << ( ostream& (*op) (ostream&)) ...

Отговор
в отговор на KpyM #6

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, че линкера ще се шашне и ще ти се кара.

Отговор