C++ alkeita

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
5779
Äänestä

Muut lukivat myös

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 =)

Äänestä

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;
};

Äänestä
  • 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

    Äänestä

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)

Äänestä

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ä.

Äänestä

Kommentoi aloitusta


apua kirjoitti:

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

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu