Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

variable has initializer but incomplete type
WWW:

Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji diplomskih i starih studija -> Objektno programiranje (C++)
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
nemo
Moderator
Moderator


Pridružen/a: 11. 07. 2004. (21:28:31)
Postovi: (37F)16
Spol: muško
Sarma = la pohva - posuda
30 = 34 - 4
Lokacija: čakovec

PostPostano: 10:49 pon, 9. 5. 2005    Naslov: variable has initializer but incomplete type Citirajte i odgovorite

Kod je sljedeći:

[code:1]class Tocka{
public:
int x,y;
};

class Poligon;

class Pravokutnik{
private:
Tocka gornjaDesna, donjaLijeva;
public:
Pravokutnik (int gd_x, int gd_y, int dl_x, int dl_y){
gornjaDesna.x = gd_x; gornjaDesna.y = gd_y;
donjaLijeva.x = dl_x; donjaLijeva.y = dl_y;
}
const Tocka *r_gd (){ return &gornjaDesna; }
const Tocka *r_dl (){ return &donjaLijeva; }
Poligon *uPoli();
};

Poligon* Pravokutnik::uPoli()
{
static Poligon cetiriVrha(4);
Tocka pomocno;

cetiriVrha.w_Vrh(0, *r_gd());
pomocno.x = r_gd()->x; pomocno.y = r_dl()->y;
cetiriVrha.w_Vrh(1, pomocno);
pomocno.x = r_dl()->x; pomocno.y = r_gd()->y;
cetiriVrha.w_Vrh(2, pomocno);
cetiriVrha.w_Vrh(3, *r_dl());

return &cetiriVrha;
}

class Poligon{
private:
int brojVrhova;
Tocka *vrhovi;
public:
Poligon (int brVr){ brojVrhova = brVr;
vrhovi = new Tocka[brojVrhova]; }
~Poligon (){ delete [] vrhovi; }
void w_Vrh (int brVrha, Tocka Vrh){ vrhovi[brVrha].x = Vrh.x;
vrhovi[brVrha].y = Vrh.y; }
const Tocka *r_Vrh (int brVrha){ return &vrhovi[brVrha]; }
Poligon *izPrav(Pravokutnik *dvaVrha);
};[/code:1]

izbacuje mi grešku:
variable `Poligon cetiriVrha' has initializer but incomplete type

Ima li tko ideju kako da to riješim? Inače okvirno, zadatak je napraviti pretvorbu iz jednog razreda u drugi putem funkcijskih članova i to jednom iz razreda Pravokutnik, a drugi put iz razreda Poligon.
Kod je sljedeći:

Kod:
class Tocka{
    public:
        int x,y;
};

class Poligon;

class Pravokutnik{
    private:
        Tocka gornjaDesna, donjaLijeva;
    public:
        Pravokutnik (int gd_x, int gd_y, int dl_x, int dl_y){
            gornjaDesna.x = gd_x; gornjaDesna.y = gd_y;
            donjaLijeva.x = dl_x; donjaLijeva.y = dl_y;
        }
        const Tocka *r_gd (){ return &gornjaDesna; }
        const Tocka *r_dl (){ return &donjaLijeva; }
        Poligon *uPoli();
};

Poligon* Pravokutnik::uPoli()
{
    static Poligon cetiriVrha(4);
    Tocka pomocno;
   
    cetiriVrha.w_Vrh(0, *r_gd());
    pomocno.x = r_gd()->x; pomocno.y = r_dl()->y;
    cetiriVrha.w_Vrh(1, pomocno);
    pomocno.x = r_dl()->x; pomocno.y = r_gd()->y;
    cetiriVrha.w_Vrh(2, pomocno);
    cetiriVrha.w_Vrh(3, *r_dl());
   
    return &cetiriVrha;
}

class Poligon{
    private:
        int brojVrhova;
        Tocka *vrhovi;
    public:
        Poligon (int brVr){ brojVrhova = brVr;
                            vrhovi = new Tocka[brojVrhova]; }
        ~Poligon (){ delete [] vrhovi; }
        void w_Vrh (int brVrha, Tocka Vrh){ vrhovi[brVrha].x = Vrh.x;
                                            vrhovi[brVrha].y = Vrh.y; }
        const Tocka *r_Vrh (int brVrha){ return &vrhovi[brVrha]; }
        Poligon *izPrav(Pravokutnik *dvaVrha);
};


izbacuje mi grešku:
variable `Poligon cetiriVrha' has initializer but incomplete type

Ima li tko ideju kako da to riješim? Inače okvirno, zadatak je napraviti pretvorbu iz jednog razreda u drugi putem funkcijskih članova i to jednom iz razreda Pravokutnik, a drugi put iz razreda Poligon.



_________________
Umjesto da postavlja pitanje o tome što je prije nastalo - kokoš ili jaje, čovjeku se najednom učinilo da je kokoš zamisao jajeta o stvaranju novih jaja.
[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail Posjetite Web stranice
mdoko
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12)
Postovi: (71A)16
Spol: muško
Sarma = la pohva - posuda
199 = 237 - 38
Lokacija: Heriot-Watt University, Edinburgh

PostPostano: 14:31 pon, 9. 5. 2005    Naslov: Citirajte i odgovorite

Ovako iz glave, cini mi se da je problem u tome sto koristis konstruktor Poligon::Poligon(int); bez da si prethodno naveo prototip te funkcije.

Jos bih komentirao neke stvari vezane za organizaciju gornjeg koda:

- u funkcijama const Tocka *Pravokutnik::r_gd (); i const Tocka *Pravokutnik::r_gd () vracas pointer na privatnu member varijablu klase Pravokutnik sto je klasicni primjer loseg dizajna jer omogucava pristup implementaciji klase bez koristenja public interfacea.

- u funkciji Poligon* Pravokutnik::uPoli(); vracas pointer na objekt koji je lokalan toj funkciji sto moze stvoriti jako puno problema. U ovom slucajui objekt je staticki, pa nece doci do dangling pointera, ali moze doci do toga da se nakon sto se funkcija pozove povratna vrijednost pridruzi nekom pointeru. U slijedecem funkcijskom pozivu ce se vrijednost statickog lokalnog objekta cetiriVrha promijeniti a to ce za posljedicu imati da ranije spomenuti pointer pokazuje na inkorektnu vrijednost.

- takodjer bi bilo bolje da se konverzija rijesi pomocu operatora konverzije.
Ovako iz glave, cini mi se da je problem u tome sto koristis konstruktor Poligon::Poligon(int); bez da si prethodno naveo prototip te funkcije.

Jos bih komentirao neke stvari vezane za organizaciju gornjeg koda:

- u funkcijama const Tocka *Pravokutnik::r_gd (); i const Tocka *Pravokutnik::r_gd () vracas pointer na privatnu member varijablu klase Pravokutnik sto je klasicni primjer loseg dizajna jer omogucava pristup implementaciji klase bez koristenja public interfacea.

- u funkciji Poligon* Pravokutnik::uPoli(); vracas pointer na objekt koji je lokalan toj funkciji sto moze stvoriti jako puno problema. U ovom slucajui objekt je staticki, pa nece doci do dangling pointera, ali moze doci do toga da se nakon sto se funkcija pozove povratna vrijednost pridruzi nekom pointeru. U slijedecem funkcijskom pozivu ce se vrijednost statickog lokalnog objekta cetiriVrha promijeniti a to ce za posljedicu imati da ranije spomenuti pointer pokazuje na inkorektnu vrijednost.

- takodjer bi bilo bolje da se konverzija rijesi pomocu operatora konverzije.



_________________
Extraordinary claims require extraordinary evidence. – Carl Sagan
[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
nemo
Moderator
Moderator


Pridružen/a: 11. 07. 2004. (21:28:31)
Postovi: (37F)16
Spol: muško
Sarma = la pohva - posuda
30 = 34 - 4
Lokacija: čakovec

PostPostano: 15:31 pon, 9. 5. 2005    Naslov: Citirajte i odgovorite

[quote="mdoko"]Ovako iz glave, cini mi se da je problem u tome sto koristis konstruktor Poligon::Poligon(int); bez da si prethodno naveo prototip te funkcije.[/quote]

pa stvarka je inline i ne vidim u čemu je bad. stvar koja se meni čini problematična je dodatne dekleracija class Poligon; prije klase Pravokutnik (što mi treba). Iz nekog razloga mi to to baš i ne radi kako sam si zacrtao.

[quote="mdoko"]u funkcijama const Tocka *Pravokutnik::r_gd (); i const Tocka *Pravokutnik::r_gd () vracas pointer na privatnu member varijablu klase Pravokutnik sto je klasicni primjer loseg dizajna jer omogucava pristup implementaciji klase bez koristenja public interfacea.[/quote]

:? samo malo, pa te funkcije jesu dio public interfacea i služe isključivo za čitanje. ja do tih vrijednosti moram imati pristup, inače se gubi smisao klase.

[quote="mdoko"]takodjer bi bilo bolje da se konverzija rijesi pomocu operatora konverzije.[/quote]

probavam :g:
mdoko (napisa):
Ovako iz glave, cini mi se da je problem u tome sto koristis konstruktor Poligon::Poligon(int); bez da si prethodno naveo prototip te funkcije.


pa stvarka je inline i ne vidim u čemu je bad. stvar koja se meni čini problematična je dodatne dekleracija class Poligon; prije klase Pravokutnik (što mi treba). Iz nekog razloga mi to to baš i ne radi kako sam si zacrtao.

mdoko (napisa):
u funkcijama const Tocka *Pravokutnik::r_gd (); i const Tocka *Pravokutnik::r_gd () vracas pointer na privatnu member varijablu klase Pravokutnik sto je klasicni primjer loseg dizajna jer omogucava pristup implementaciji klase bez koristenja public interfacea.


Confused samo malo, pa te funkcije jesu dio public interfacea i služe isključivo za čitanje. ja do tih vrijednosti moram imati pristup, inače se gubi smisao klase.

mdoko (napisa):
takodjer bi bilo bolje da se konverzija rijesi pomocu operatora konverzije.


probavam Mr. Green



_________________
Umjesto da postavlja pitanje o tome što je prije nastalo - kokoš ili jaje, čovjeku se najednom učinilo da je kokoš zamisao jajeta o stvaranju novih jaja.
[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail Posjetite Web stranice
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (355F)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 16:06 pon, 9. 5. 2005    Naslov: Citirajte i odgovorite

[quote="nemo"][quote="mdoko"]u funkcijama const Tocka *Pravokutnik::r_gd (); i const Tocka *Pravokutnik::r_gd () vracas pointer na privatnu member varijablu klase Pravokutnik sto je klasicni primjer loseg dizajna jer omogucava pristup implementaciji klase bez koristenja public interfacea.[/quote]
:? samo malo, pa te funkcije jesu dio public interfacea i služe isključivo za čitanje. ja do tih vrijednosti moram imati pristup, inače se gubi smisao klase.[/quote]

Ali, ako vratis pointer, onda korisnik tvoje klase moze bez problema mijenjati vrijednost te varijable, sto ti nije bila namjera, zar ne? ;)
nemo (napisa):
mdoko (napisa):
u funkcijama const Tocka *Pravokutnik::r_gd (); i const Tocka *Pravokutnik::r_gd () vracas pointer na privatnu member varijablu klase Pravokutnik sto je klasicni primjer loseg dizajna jer omogucava pristup implementaciji klase bez koristenja public interfacea.

Confused samo malo, pa te funkcije jesu dio public interfacea i služe isključivo za čitanje. ja do tih vrijednosti moram imati pristup, inače se gubi smisao klase.


Ali, ako vratis pointer, onda korisnik tvoje klase moze bez problema mijenjati vrijednost te varijable, sto ti nije bila namjera, zar ne? Wink



_________________
U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
nemo
Moderator
Moderator


Pridružen/a: 11. 07. 2004. (21:28:31)
Postovi: (37F)16
Spol: muško
Sarma = la pohva - posuda
30 = 34 - 4
Lokacija: čakovec

PostPostano: 18:04 pon, 9. 5. 2005    Naslov: Citirajte i odgovorite

[quote="vsego"]Ali, ako vratis pointer, onda korisnik tvoje klase moze bez problema mijenjati vrijednost te varijable, sto ti nije bila namjera, zar ne? ;)[/quote]

da, ali ovaj const komadić bi ga u tome trebao spriječiti. barem je mene kada sam to pokušao :?

inače stvar sam malo preroštao i sada radi. pretvaranje se odvija preko konstruktora, a ne preko operatora za pretvorbu. rješenje je bilo jednostavno - umjesto da radim preddeklaraciju, jednostavno sam konstruktor od Pravokutnika pomaknuo ispod deklaracije klase Poligon i stvar radi.

idemo na sljedeći zadatak :D
vsego (napisa):
Ali, ako vratis pointer, onda korisnik tvoje klase moze bez problema mijenjati vrijednost te varijable, sto ti nije bila namjera, zar ne? Wink


da, ali ovaj const komadić bi ga u tome trebao spriječiti. barem je mene kada sam to pokušao Confused

inače stvar sam malo preroštao i sada radi. pretvaranje se odvija preko konstruktora, a ne preko operatora za pretvorbu. rješenje je bilo jednostavno - umjesto da radim preddeklaraciju, jednostavno sam konstruktor od Pravokutnika pomaknuo ispod deklaracije klase Poligon i stvar radi.

idemo na sljedeći zadatak Very Happy



_________________
Umjesto da postavlja pitanje o tome što je prije nastalo - kokoš ili jaje, čovjeku se najednom učinilo da je kokoš zamisao jajeta o stvaranju novih jaja.
[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail Posjetite Web stranice
mdoko
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12)
Postovi: (71A)16
Spol: muško
Sarma = la pohva - posuda
199 = 237 - 38
Lokacija: Heriot-Watt University, Edinburgh

PostPostano: 22:42 pon, 9. 5. 2005    Naslov: Citirajte i odgovorite

[quote="nemo"][quote="vsego"]Ali, ako vratis pointer, onda korisnik tvoje klase moze bez problema mijenjati vrijednost te varijable, sto ti nije bila namjera, zar ne? ;)[/quote]

da, ali ovaj const komadić bi ga u tome trebao spriječiti. barem je mene kada sam to pokušao :?
[/quote]

Jesi mozda cuo za const_cast? Ako vracas vrijednost, a ne pointer, onda si zastitio svoju klasu.

[quote]
pretvaranje se odvija preko konstruktora, a ne preko operatora za pretvorbu.
[/quote]

ok, moze i tako
[quote]
rješenje je bilo jednostavno - umjesto da radim preddeklaraciju, jednostavno sam konstruktor od Pravokutnika pomaknuo ispod deklaracije klase Poligon i stvar radi.
[/quote]

To sam i govorio. Kada napises [code:1] class Poligon;[/code:1] onda samo kazes da ce se koristiti klasa Poligon, ali nista ne kazes o njenim member funkcijama, tako da ako kompajler naidje na poziv neke njene member funkcije nece znati kreirati strojni kod jer ne zna argumente i povratni tip funkcije.
nemo (napisa):
vsego (napisa):
Ali, ako vratis pointer, onda korisnik tvoje klase moze bez problema mijenjati vrijednost te varijable, sto ti nije bila namjera, zar ne? Wink


da, ali ovaj const komadić bi ga u tome trebao spriječiti. barem je mene kada sam to pokušao Confused


Jesi mozda cuo za const_cast? Ako vracas vrijednost, a ne pointer, onda si zastitio svoju klasu.

Citat:

pretvaranje se odvija preko konstruktora, a ne preko operatora za pretvorbu.


ok, moze i tako
Citat:

rješenje je bilo jednostavno - umjesto da radim preddeklaraciju, jednostavno sam konstruktor od Pravokutnika pomaknuo ispod deklaracije klase Poligon i stvar radi.


To sam i govorio. Kada napises
Kod:
 class Poligon;
onda samo kazes da ce se koristiti klasa Poligon, ali nista ne kazes o njenim member funkcijama, tako da ako kompajler naidje na poziv neke njene member funkcije nece znati kreirati strojni kod jer ne zna argumente i povratni tip funkcije.



_________________
Extraordinary claims require extraordinary evidence. – Carl Sagan
[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji diplomskih i starih studija -> Objektno programiranje (C++) Vremenska zona: GMT + 01:00.
Stranica 1 / 1.

 
Forum(o)Bir:  
Možete otvarati nove teme.
Možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You can attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan