Olen törmännyt koodeihin, jossa luokka esitellaan etukäteen esim. koodissa rivi 2 eli "class testi;". Miksi näin tehdään?
En keksinyt mitään muuta syytä kuin että headerit on esitelty väärässä tai epäloogisessa järjestyksessä. Onko tämä syy? Kuitenkaan "//testi kkkk;" ei toimi, joten epäilen.
Eli miksi luokka joskus esitellään etukäteen?
----------koodi--------------
#include
class testi; //Miksi tämä esitellään täällä?
//Jos testi luokka esitellään täällä, niin toimii ilman tätä riviä.
class koe
{
public:
int a,b;
void tulosta(testi a);
koe(); //konstruktori
//testi kkkk;
};
class testi
{
public:
testi();
};
koe::koe()
{
cout
En keksinyt mitään muuta syytä kuin että headerit on esitelty väärässä tai epäloogisessa järjestyksessä. Onko tämä syy? Kuitenkaan "//testi kkkk;" ei toimi, joten epäilen.
Eli miksi luokka joskus esitellään etukäteen?
----------koodi--------------
#include
class testi; //Miksi tämä esitellään täällä?
//Jos testi luokka esitellään täällä, niin toimii ilman tätä riviä.
class koe
{
public:
int a,b;
void tulosta(testi a);
koe(); //konstruktori
//testi kkkk;
};
class testi
{
public:
testi();
};
koe::koe()
{
cout
Vastaukset 5
Vanhimmat
"class testi; //Miksi tämä esitellään täällä?
//Jos testi luokka esitellään täällä, niin toimii ilman tätä riviä. "
//mitä tuo tarkotti???
//eli toimii ilman tuota riviä??
//ja ei?? sen kanssa??? sekasin menin...
//voi johtua alkoholi annoksesta mut kuitenki =)
Esim. tällaisessa tilantessa tuo luokan esi-esittely on tarpeen, jotta kääntäjä tietäisi, mitä tyyppejä on käytössä (ja että käytetyt tyypit määritellään myöhemmin. (muna-kana-ongelma :))
class A
{
B foo;
};
class B
{
A bar;
};
Ajattelin aluksi, että kyse on juuri tästä!
Mutta en kuitenkaan saanut toimimaan kyseistä esi-esittelyä.
=================================================
Esi-esittelyn kanssa:
=================================================
Compiling...
koodi.cpp
C:\koodi\koodi.cpp(7) : error C2079: 'foo' uses undefined class 'B'
Error executing cl.exe.
koodi.exe - 1 error(s), 0 warning(s)
=================================================
Ilman esi-esittelyä:
================================================
Compiling...
koodi.cpp
C:\koodi\koodi.cpp(7) : error C2146: syntax error : missing ';' before identifier 'foo'
C:\koodi\koodi.cpp(7) : error C2501: 'B' : missing storage-class or type specifiers
C:\koodi\koodi.cpp(7) : error C2501: 'foo' : missing storage-class or type specifiers
Error executing cl.exe.
koodi.exe - 3 error(s), 0 warning(s)
-------koodi----------
#include
class B;
class A
{
B foo;
};
class B
{
A bar;
};
void main ()
{
A koe;
B testi;
cout
Kääntäjä kääntää rivi kerralla. Kun se tulee riville:
void tulosta(testi a);
...sillä ei ole aavistustakaan mitä tuo testi on (int, double, class, struct...). Kääntäjä tarvitsee tätä tietoa voidakseen tehdä oikeat tilanvaraukset ym.
Eli tästä syystä ilmoitetaan aikaisemmin että kyseessä on olio class testi; (millainen tämä olio tarkasti on voimme määrittää myöhemmin)
Joo, c käännösyksikkö (.cpp-file) käännetään vain kerran (yleensä). Nyt kun se kääntää tota luokkaa 'koe', ja se näkee, että täällä käytetään toista symbolia 'testi'. Tossa vaiheessa kääntäjä tarkistaa symbolitaulusta, onko tollasta symbolia olemassakaan. Mikäli ei niin annetaan luonnollisesti virhe.
Eli pitää kertoa kääntäjälle, että tälläinen luokka on olemassa. Ns. forward declaration:
class testi;
Katoppas vaikka esimerkkinä. Ja vielä kun koodaat, muuta ensimmäiset kaksi riviä:
#include
using namespace std;
Niin homma näyttää paremmalta useimpien kääntäjien mielestä.