Oppure

Loading
01/07/10 22:41
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:

type
    pacmen=object (entita)
    public
    {...}
    private
    {...}
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".
02/07/10 20:10
Poggi Marco
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.
aaa
02/07/10 20:27
La unit classe_entita:

unit classe_entita;
interface
var fuga:boolean;
var uscita:boolean;
type
	entita=object
	private
		x:byte;
		y:byte;
		vettore_x:shortint;
		vettore_y:shortint;
		colore:byte;
	public
                procedure accendi_cursore(ascissa,ordinata,color:byte);	
		function get_x():byte;
		function get_y():byte;
end;
implementation
uses wingraph,lib_mura;
procedure entita.accendi_cursore(ascissa,ordinata,color:byte);	
var a:integer;
begin
	case color of
	1:	setcolor(yellow);
	2:	setcolor(red);
	3:	setcolor(white);
	4:	setcolor(blue);
	5:	setcolor(green);
	6:	setcolor(orange);
	else 	setcolor(black);	
	end;
	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);
end;
function entita.get_x():byte;
begin
	get_x:=x;	
end;
function entita.get_y():byte;
begin
	get_y:=y;
end;
end.


La dichiarazione della classe ghosts che eredita da entita:

unit lib_entita;

interface

uses lib_mura,wingraph,wincrt,classe_entita;

type
	ghosts=object (entita)
	
	PRIVATE
	cattiveria:byte;
	lastwalked:smallint;
	PUBLIC
	constructor crea(ascissa,ordinata,colour,tinturia:byte);
	procedure vettorizza(x_target,y_target:byte; terreno:campo);
	procedure sposta(terreno:campo);
end;


Gli errori che ricevo:

C:\Documents and Settings\Ciccio\Desktop\pacman>ppc386 lib_entita.pas
Free Pascal Compiler version 2.4.0 [2009/12/18] for i386
Copyright (c) 1993-2009 by Florian Klaempfl
Target OS: Win32 for i386
Compiling lib_entita.pas
lib_entita.pas(74,3) Error: Identifier not found "x"
lib_entita.pas(75,3) Error: Identifier not found "y"
lib_entita.pas(76,15) Error: Identifier not found "x"
lib_entita.pas(76,21) Error: Identifier not found "y"
lib_entita.pas(77,11) Error: Identifier not found "vettore_x"
lib_entita.pas(78,11) Error: Identifier not found "vettore_y"
lib_entita.pas(79,8) Error: Identifier not found "colore"
lib_entita.pas(91,19) Error: Identifier not found "x"
lib_entita.pas(91,35) Error: Identifier not found "y"
lib_entita.pas(104,27) Error: Identifier not found "x"
lib_entita.pas(104,37) Error: Identifier not found "y"
lib_entita.pas(105,27) Error: Identifier not found "x"
lib_entita.pas(105,37) Error: Identifier not found "y"
lib_entita.pas(106,26) Error: Identifier not found "x"
lib_entita.pas(106,34) Error: Identifier not found "y"
lib_entita.pas(107,26) Error: Identifier not found "x"
lib_entita.pas(107,34) Error: Identifier not found "y"
lib_entita.pas(137,6) Error: Identifier not found "x"
lib_entita.pas(139,12) Error: Identifier not found "vettore_x"
lib_entita.pas(139,46) Error: Identifier not found "x"
lib_entita.pas(139,87) Error: Identifier not found "x"
lib_entita.pas(140,12) Error: Identifier not found "vettore_y"
lib_entita.pas(142,6) Error: Identifier not found "y"
lib_entita.pas(144,12) Error: Identifier not found "vettore_y"
lib_entita.pas(144,45) Error: Identifier not found "y"
lib_entita.pas(144,85) Error: Identifier not found "y"
lib_entita.pas(145,12) Error: Identifier not found "vettore_x"
lib_entita.pas(148,19) Error: Identifier not found "vettore_x"
lib_entita.pas(148,21) Error: Identifier not found "x"
lib_entita.pas(148,57) Error: Identifier not found "vettore_x"
lib_entita.pas(148,59) Error: Identifier not found "x"
lib_entita.pas(148,77) Error: Identifier not found "vettore_y"
lib_entita.pas(148,79) Error: Identifier not found "y"
lib_entita.pas(148,115) Error: Identifier not found "vettore_y"
lib_entita.pas(148,117) Error: Identifier not found "y"
lib_entita.pas(150,39) Error: Identifier not found "vettore_x"
lib_entita.pas(150,41) Error: Identifier not found "x"
lib_entita.pas(150,51) Error: Identifier not found "vettore_y"
lib_entita.pas(150,53) Error: Identifier not found "y"
lib_entita.pas(152,12) Error: Identifier not found "vettore_x"
lib_entita.pas(153,12) Error: Identifier not found "vettore_y"
lib_entita.pas(161,15) Error: Identifier not found "x"
lib_entita.pas(161,21) Error: Identifier not found "y"
lib_entita.pas(162,25) Error: Identifier not found "x"
lib_entita.pas(162,27) Error: Identifier not found "y"
lib_entita.pas(162,29) Error: Identifier not found "x"
lib_entita.pas(162,31) Error: Identifier not found "y"
lib_entita.pas(164,7) Error: Identifier not found "x"
lib_entita.pas(164,25) Error: Identifier not found "vettore_x"
lib_entita.pas(164,36) Error: Identifier not found "x"
lib_entita.pas(164,36) Fatal: There were 50 errors compiling module, stopping
Fatal: Compilation aborted
Ultima modifica effettuata da 02/07/10 20:32
02/07/10 20:41
Poggi Marco
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.
aaa
02/07/10 21:00
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?!
02/07/10 21:39
Poggi Marco
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.
aaa
23/07/10 21:15
Saladino
Un consiglio :
se vorrai fare una nuova versione dichiare le tue classi con :
class

e non
object
, che è sconsigliato.
Il motivo non lo so,ma lo avevo letto su internet.
aaa
23/07/10 21:36
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ù: delphibasics.co.uk/…
aaa