help: templaty a streamy

Uživatelský avatar
Tuetschek
Supermatfyz(ák|ačka)
Příspěvky: 657
Registrován: 15. 6. 2005 13:54
Typ studia: Nestuduji ale učím na MFF
Kontaktovat uživatele:

help: templaty a streamy

Příspěvek od Tuetschek »

Cau,
nevite nekdo jak spravne psat hlavicky friend template funkci? Hral jsem si s tim zapoctovym prikladem z 23.1. (template pro zlomky) a nemuzu donutit MSVS aby mi ho zkompilovalo, kdyz vytvorim "operator /" jako globalni funkci:

Kód: Vybrat vše

template< class T, class Traits> Zlomek< T, Traits > operator / ( const Zlomek< T, Traits> & a, const Zlomek< T, Traits> & b );
- kdyz ve tride napisu neco jako:

Kód: Vybrat vše

friend Zlomek< T, Traits > operator / < T, Traits> ( const Zlomek< T, Traits> & a, const Zlomek< T, Traits> & b );
vypada to, ze MSVS si mysli ze deklaruji datovou polozku, a vybleje na me hromadu chyb... :cry:

Jeste neco... jde nejak rychle a jednoduse pracovat bud se std. vstupem nebo se souborem za pouziti jedny promenny? Me napada jedine vyrobit si nejakou vlastni tridu ktera to bude zajistovat... myslim neco jako je v C:

Kód: Vybrat vše

FILE * f;
fopen( fr, stdin );
Nevim... mozna jsem uplne blbej ze to nevim :) ... nebo naopak chci nemozny?
Plug 'n' Pray.
Uživatelský avatar
darkness
Matfyz(ák|ačka) level II
Příspěvky: 70
Registrován: 15. 1. 2005 13:24
Typ studia: Informatika Mgr.
Bydliště: pod mostem (Nuselskym)
Kontaktovat uživatele:

Příspěvek od darkness »

tak sablonam zrovna moc nerozumim, ale s tim druhym bych Ti mohla poradit..

melo by to jit nejak takto:

Kód: Vybrat vše

FILE *fr = stdin;
if (bude se cist ze souboru)
  fr = fopen("jmeno_souboru","r");
a samozrejme, jeste kontrola, jestli se soubor spravne otevrel ;-)
takhle mi to fungovalo, ale jde to i jinak - pomoci streamu
Uživatelský avatar
wintermute
Matfyz(ák|ačka) level III
Příspěvky: 153
Registrován: 23. 5. 2005 22:06
Typ studia: Informatika Mgr.

Příspěvek od wintermute »

Podle mě by ty šablony měly vypadat asi takhle:

Kód: Vybrat vše

template <class T> class zlomek;
template <class T> zlomek<T> operator / (const zlomek<T> & a, const zlomek<T> & b);

template <class T> class zlomek{
	private:
		T citatel, jmenovatel;
		friend zlomek operator /<> (const zlomek& a, const zlomek& b);
};

template <class T> zlomek<T> operator / (const zlomek<T> & a, const zlomek<T> & b){
	/*...*/
}
(ale nic nezaručuju)
Uživatelský avatar
Che
Donátor
Donátor
Příspěvky: 166
Registrován: 2. 6. 2005 12:29
Typ studia: Informatika Mgr.
Bydliště: EU
Kontaktovat uživatele:

Re: help: templaty a streamy

Příspěvek od Che »

Tuetschek píše: Jeste neco... jde nejak rychle a jednoduse pracovat bud se std. vstupem nebo se souborem za pouziti jedny promenny? Me napada jedine vyrobit si nejakou vlastni tridu ktera to bude zajistovat... myslim neco jako je v C:

Kód: Vybrat vše

FILE * f;
fopen( fr, stdin );
Nevim... mozna jsem uplne blbej ze to nevim :) ... nebo naopak chci nemozny?
Možná je ještě nějaký hezčí řešení, ale velice jednoduché řešení je ukazatel na stream:

Kód: Vybrat vše

// defaultne std. vstup
istream *sp_in = &cin;
//
ifstream ifs;

// filename definovano?
if ( !filename.empty() ) {
  ifs.open(filename.c_str(), ios::in);
  if ( ifs ) {
    // nyni vstup ze souboru
    sp_in = &ifs;
  }
  else {
    throw Whatever();
  }
}
Pak ale nesmíš zapomenout, že nepracuješ se streamem, ale s ukazatelem na stream:

Kód: Vybrat vše

  *sp_in >> c;
shoot that shit
Uživatelský avatar
hippies
Admin(ka) level I
Příspěvky: 990
Registrován: 29. 9. 2004 12:46
Typ studia: Informatika Mgr.
Bydliště: Mladá Boleslav
Kontaktovat uživatele:

Příspěvek od hippies »

Jo tak tenhle problém jsem taky řešil. Ukazatel na stream je sice hezkej, ale nevim, jak rozlišit, jestli volat close, či nikoliv. Jediný co mě teda nakonce napadlo bylo vytvořit vlastní třídu, která bude mít v sobě dva streamy, bool a přetížený <<,resp. >>. Pak vše vyřeší konstruktor a destruktor.
Uživatelský avatar
MyS
Donátor
Donátor
Příspěvky: 178
Registrován: 22. 9. 2004 00:13
Typ studia: Informatika Bc.
Bydliště: The city of Dobříš
Kontaktovat uživatele:

Příspěvek od MyS »

Mno, ten problem s templatama a friend fcema jsem kdysi resil, je to takovy "zasmodrchany";). Nejlepsi je psat telo friend funkce rovnou dovnitr sablonovany tridy. Detailneji viz napriklad http://groups.google.com/group/alt.comp ... l=cs&fwc=2

Mno, a co se tyce streamu, pouzivam tohle: praci se streamy pisu do funkci, ktere berou parametr instream/ostream a pak uz je jen na mne, jestli ty fci poslu cin nebo nejaky jinym, treba ifstream.
We don't need no education!
Uživatelský avatar
Che
Donátor
Donátor
Příspěvky: 166
Registrován: 2. 6. 2005 12:29
Typ studia: Informatika Mgr.
Bydliště: EU
Kontaktovat uživatele:

Příspěvek od Che »

hippies píše:Jo tak tenhle problém jsem taky řešil. Ukazatel na stream je sice hezkej, ale nevim, jak rozlišit, jestli volat close, či nikoliv.
Třeba takhle:

Kód: Vybrat vše

if ( sp_in == &ifs ) {
  sp_in->close();
}
shoot that shit
Uživatelský avatar
hippies
Admin(ka) level I
Příspěvky: 990
Registrován: 29. 9. 2004 12:46
Typ studia: Informatika Mgr.
Bydliště: Mladá Boleslav
Kontaktovat uživatele:

Příspěvek od hippies »

Che píše: Třeba takhle:

Kód: Vybrat vše

if ( sp_in == &ifs ) {
  sp_in->close();
}
A to ti dovolí? sp_in->close(), jestli je sp_in jen ukazatel na istream, tak je přece vidí jen to společný, nebo ne?
Uživatelský avatar
Che
Donátor
Donátor
Příspěvky: 166
Registrován: 2. 6. 2005 12:29
Typ studia: Informatika Mgr.
Bydliště: EU
Kontaktovat uživatele:

Příspěvek od Che »

hippies píše:
Che píše: Třeba takhle:

Kód: Vybrat vše

if ( sp_in == &ifs ) {
  sp_in->close();
}
A to ti dovolí? sp_in->close(), jestli je sp_in jen ukazatel na istream, tak je přece vidí jen to společný, nebo ne?
Nedovolí, máš pravdu, istream close() nemá. Muselo by se to ještě přetypovat:

Kód: Vybrat vše

if ( sp_in == &ifs ) {
  static_cast<fstream *>(sp_in)->close();
}
shoot that shit
Uživatelský avatar
hippies
Admin(ka) level I
Příspěvky: 990
Registrován: 29. 9. 2004 12:46
Typ studia: Informatika Mgr.
Bydliště: Mladá Boleslav
Kontaktovat uživatele:

Příspěvek od hippies »

Che píše:
hippies píše:
Che píše: Třeba takhle:

Kód: Vybrat vše

if ( sp_in == &ifs ) {
  sp_in->close();
}
A to ti dovolí? sp_in->close(), jestli je sp_in jen ukazatel na istream, tak je přece vidí jen to společný, nebo ne?
Nedovolí, máš pravdu, istream close() nemá. Muselo by se to ještě přetypovat:

Kód: Vybrat vše

if ( sp_in == &ifs ) {
  static_cast<fstream *>(sp_in)->close();
}
no ale to už je jednodušší a podle mě mnohem hezčí dát to do tý třídy,.. jen je mi divný,.. to už někoho muselo napadnout, takovej stream určitě je, jen vědět kde a jak se jmenuje
Uživatelský avatar
Tuetschek
Supermatfyz(ák|ačka)
Příspěvky: 657
Registrován: 15. 6. 2005 13:54
Typ studia: Nestuduji ale učím na MFF
Kontaktovat uživatele:

Příspěvek od Tuetschek »

Diky moc...
nejak mi u tech templatu nenapadlo ze se musi predem deklarovat existence tridy, potom ty template funkce (aby mohla tu tridu vracet) a az potom psat definici tridy (aby vedela o tom ze nekde existuje ta friend funkce ) a funkci samotnou.... uff.

Mimochodem koukam ze jsem vcera k ty otazce o streamech jako kod napsal peknou kravinu :D ...
Plug 'n' Pray.
Odpovědět

Zpět na „2005“