Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
nemo Moderator
Pridružen/a: 11. 07. 2004. (21:28:31) Postovi: (37F)16
Spol:
Lokacija: čakovec
|
Postano: 10:49 pon, 9. 5. 2005 Naslov: variable has initializer but incomplete type |
|
|
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] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
|
[Vrh] |
|
nemo Moderator
Pridružen/a: 11. 07. 2004. (21:28:31) Postovi: (37F)16
Spol:
Lokacija: čakovec
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (355F)16
Spol:
Lokacija: /sbin/init
|
Postano: 16:06 pon, 9. 5. 2005 Naslov: |
|
|
[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. |
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?
_________________ 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.
|
|
[Vrh] |
|
nemo Moderator
Pridružen/a: 11. 07. 2004. (21:28:31) Postovi: (37F)16
Spol:
Lokacija: čakovec
|
Postano: 18:04 pon, 9. 5. 2005 Naslov: |
|
|
[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? |
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
_________________ 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] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
Postano: 22:42 pon, 9. 5. 2005 Naslov: |
|
|
[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? |
da, ali ovaj const komadić bi ga u tome trebao spriječiti. barem je mene kada sam to pokušao
|
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 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] |
|
|