Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
Pascal - Eriditarietà da classe importata da una libreria
Forum - Pascal - Eriditarietà da classe importata da una libreria

Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
Quando ho diviso il sorgente in tante unità in modo tale da renderne più facile la correzione/modifica mi è venuto in mente di creare una libreria per ogni classe. Così ho spostato la classe entita insieme alle dichiarazioni di tutti i suoi metodi in una libreria separata. Sino a qui tutto ok. Nel sorgente originale vi erano 2 classi pacmen e ghosts le quali ereditavano dalla classe entita. Sino a quando si trovavano nello stesso source tutto filava liscio. Non appena ho spostato entita in un source a parte sono iniziati a comparire dei Fatal Error in fase di compilazione. Io importo la libreria lib_entita e dopo di che dichiaro:

Codice sorgente - presumibilmente Pascal

  1. type
  2.     pacmen=object (entita)
  3.     public
  4.     {...}
  5.     private
  6.     {...}
  7. end;




sino alla dichiarazione della classe tutto funge alla perfezione..ma non appena faccio riferimento a qualche campo della classe entita nei metodi delle classi che ereditano iniziano i Fatal Error e gli Identifier Not Found.

Non è un problema vitale, ma non so spiegarmi il perchè di questo "bug".

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 22:10
Venerdì, 02/07/2010
Gli eventuali errori potrebbero essere molteplici... 8-|

Es.:
- Il nome dell' unità in cui si trova entita, non è dichiarato.
- L' accesso al compo o metodo della classe base è protetto.
...

Posta il codice dle classi per chiarire meglio il problema.

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 22:27
Venerdì, 02/07/2010
La unit classe_entita:

Codice sorgente - presumibilmente Delphi

  1. unit classe_entita;
  2. interface
  3. var fuga:boolean;
  4. var uscita:boolean;
  5. type
  6.         entita=object
  7.         private
  8.                 x:byte;
  9.                 y:byte;
  10.                 vettore_x:shortint;
  11.                 vettore_y:shortint;
  12.                 colore:byte;
  13.         public
  14.                 procedure accendi_cursore(ascissa,ordinata,color:byte);
  15.                 function get_x():byte;
  16.                 function get_y():byte;
  17. end;
  18. implementation
  19. uses wingraph,lib_mura;
  20. procedure entita.accendi_cursore(ascissa,ordinata,color:byte); 
  21. var a:integer;
  22. begin
  23.         case color of
  24.         1:      setcolor(yellow);
  25.         2:      setcolor(red);
  26.         3:      setcolor(white);
  27.         4:      setcolor(blue);
  28.         5:      setcolor(green);
  29.         6:      setcolor(orange);
  30.         else    setcolor(black);       
  31.         end;
  32.         for a:=ascissa*dimensione_cella+1 to ascissa*dimensione_cella+dimensione_cella do line(a,ordinata*dimensione_cella+1,a,ordinata*dimensione_cella+dimensione_cella);
  33. end;
  34. function entita.get_x():byte;
  35. begin
  36.         get_x:=x;      
  37. end;
  38. function entita.get_y():byte;
  39. begin
  40.         get_y:=y;
  41. end;
  42. end.



La dichiarazione della classe ghosts che eredita da entita:

Codice sorgente - presumibilmente Delphi

  1. unit lib_entita;
  2.  
  3. interface
  4.  
  5. uses lib_mura,wingraph,wincrt,classe_entita;
  6.  
  7. type
  8.         ghosts=object (entita)
  9.        
  10.         PRIVATE
  11.         cattiveria:byte;
  12.         lastwalked:smallint;
  13.         PUBLIC
  14.         constructor crea(ascissa,ordinata,colour,tinturia:byte);
  15.         procedure vettorizza(x_target,y_target:byte; terreno:campo);
  16.         procedure sposta(terreno:campo);
  17. end;



Gli errori che ricevo:

Codice sorgente - presumibilmente Delphi

  1. C:\Documents and Settings\Ciccio\Desktop\pacman>ppc386 lib_entita.pas
  2. Free Pascal Compiler version 2.4.0 [2009/12/18] for i386
  3. Copyright (c) 1993-2009 by Florian Klaempfl
  4. Target OS: Win32 for i386
  5. Compiling lib_entita.pas
  6. lib_entita.pas(74,3) Error: Identifier not found "x"
  7. lib_entita.pas(75,3) Error: Identifier not found "y"
  8. lib_entita.pas(76,15) Error: Identifier not found "x"
  9. lib_entita.pas(76,21) Error: Identifier not found "y"
  10. lib_entita.pas(77,11) Error: Identifier not found "vettore_x"
  11. lib_entita.pas(78,11) Error: Identifier not found "vettore_y"
  12. lib_entita.pas(79,8) Error: Identifier not found "colore"
  13. lib_entita.pas(91,19) Error: Identifier not found "x"
  14. lib_entita.pas(91,35) Error: Identifier not found "y"
  15. lib_entita.pas(104,27) Error: Identifier not found "x"
  16. lib_entita.pas(104,37) Error: Identifier not found "y"
  17. lib_entita.pas(105,27) Error: Identifier not found "x"
  18. lib_entita.pas(105,37) Error: Identifier not found "y"
  19. lib_entita.pas(106,26) Error: Identifier not found "x"
  20. lib_entita.pas(106,34) Error: Identifier not found "y"
  21. lib_entita.pas(107,26) Error: Identifier not found "x"
  22. lib_entita.pas(107,34) Error: Identifier not found "y"
  23. lib_entita.pas(137,6) Error: Identifier not found "x"
  24. lib_entita.pas(139,12) Error: Identifier not found "vettore_x"
  25. lib_entita.pas(139,46) Error: Identifier not found "x"
  26. lib_entita.pas(139,87) Error: Identifier not found "x"
  27. lib_entita.pas(140,12) Error: Identifier not found "vettore_y"
  28. lib_entita.pas(142,6) Error: Identifier not found "y"
  29. lib_entita.pas(144,12) Error: Identifier not found "vettore_y"
  30. lib_entita.pas(144,45) Error: Identifier not found "y"
  31. lib_entita.pas(144,85) Error: Identifier not found "y"
  32. lib_entita.pas(145,12) Error: Identifier not found "vettore_x"
  33. lib_entita.pas(148,19) Error: Identifier not found "vettore_x"
  34. lib_entita.pas(148,21) Error: Identifier not found "x"
  35. lib_entita.pas(148,57) Error: Identifier not found "vettore_x"
  36. lib_entita.pas(148,59) Error: Identifier not found "x"
  37. lib_entita.pas(148,77) Error: Identifier not found "vettore_y"
  38. lib_entita.pas(148,79) Error: Identifier not found "y"
  39. lib_entita.pas(148,115) Error: Identifier not found "vettore_y"
  40. lib_entita.pas(148,117) Error: Identifier not found "y"
  41. lib_entita.pas(150,39) Error: Identifier not found "vettore_x"
  42. lib_entita.pas(150,41) Error: Identifier not found "x"
  43. lib_entita.pas(150,51) Error: Identifier not found "vettore_y"
  44. lib_entita.pas(150,53) Error: Identifier not found "y"
  45. lib_entita.pas(152,12) Error: Identifier not found "vettore_x"
  46. lib_entita.pas(153,12) Error: Identifier not found "vettore_y"
  47. lib_entita.pas(161,15) Error: Identifier not found "x"
  48. lib_entita.pas(161,21) Error: Identifier not found "y"
  49. lib_entita.pas(162,25) Error: Identifier not found "x"
  50. lib_entita.pas(162,27) Error: Identifier not found "y"
  51. lib_entita.pas(162,29) Error: Identifier not found "x"
  52. lib_entita.pas(162,31) Error: Identifier not found "y"
  53. lib_entita.pas(164,7) Error: Identifier not found "x"
  54. lib_entita.pas(164,25) Error: Identifier not found "vettore_x"
  55. lib_entita.pas(164,36) Error: Identifier not found "x"
  56. lib_entita.pas(164,36) Fatal: There were 50 errors compiling module, stopping
  57. Fatal: Compilation aborted


Ultima modifica effettuata da il 02/07/2010 alle 22:32
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 22:41
Venerdì, 02/07/2010
Data la lista degli errori, il problema è chiaro!

Tutti i campi della classe entita sono dichiarati public, di conseguenza invisibili all' esterno.
Per risolvere queste situazioni, basta implementare dei metodi pubblici alla classe entita con lo scopo di manipolare i dati.

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 23:00
Venerdì, 02/07/2010
Ma i campi della classe entita sono dichiarati private! e comunque la classe derivante dovrebbe continuare a poter leggere tali campi perchè deriva dalla classe che li implementa. O almeno credo. Comunque se i due sources sono uniti in uno solo tutto fila liscio e non ottengo nemmeno un errore di compilazione. Quindi perchè si ha questo problema quando si scinde?!

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 23:39
Venerdì, 02/07/2010
Scosa Giarados, i campi sono private.

Tutto ciò che si è dichiarato private, è invisibile all' esterno della classe, anche agli oggetti che ereditano.

Una soluzione è quella di dichiarare i campi protected.
In questo modo, i membri della classe sono a tutti gli effetti private, tranne nel caso in cui un membro viene ereditato. In questo modo, un membro proteto della classe entita è accessibile alla classe derivata.
Pertanto,con la parola chiave protected è possibile dar vita a membri che sono privati per la loro classe, ma che rimangono tuttavia ereditabili e accessibili per una classe derivata.

PM Quote
Avatar
Saladino (Member)
Pro


Messaggi: 90
Iscritto: 30/05/2010

Segnala al moderatore
Postato alle 23:15
Venerdì, 23/07/2010
Un consiglio :
se vorrai fare una nuova versione dichiare le tue classi con :
Codice sorgente - presumibilmente Plain Text

  1. class


e non
Codice sorgente - presumibilmente Plain Text

  1. object

, che è sconsigliato.
Il motivo non lo so,ma lo avevo letto su internet.

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 23:36
Venerdì, 23/07/2010
Il qualificatore object, non è sbagliato, ma si siferisce al vecchio standard del pascal Borland per dos.
Mentre class, è supportato dal free pascal e Delphi.
Per saperne di più: http://www.delphibasics.co.uk/index.html

PM Quote
Avatar
Saladino (Member)
Pro


Messaggi: 90
Iscritto: 30/05/2010

Segnala al moderatore
Postato alle 12:23
Sabato, 24/07/2010
Testo quotato

Postato originariamente da Poggi Marco:

Il qualificatore object, non è sbagliato, ma si siferisce al vecchio standard del pascal Borland per dos.
Mentre class, è supportato dal free pascal e Delphi.
Per saperne di più: http://www.delphibasics.co.uk/index.html



Questo voul dire che la causa è la diversa gestione della memoria.

Poi non ho detto che l'uso di object è sbagliato,ma sconsigliato.
(se no come faceva a compilare)




Ultima modifica effettuata da Saladino il 24/07/2010 alle 12:27
PM Quote