Utilisateur anonyme
-
31 déc. 2007 à 12:02
Utilisateur anonyme -
31 déc. 2007 à 15:15
Bonjour,
Je poste ici car je code en delphi depuis peu. Je viens de commencer à coder des classes mais malgrès les tutorials que j'ai lus j'ai toujours un problème de violation d'acces mémoires. Je pense que je dois me tromper dans l'utilisation des
constructor
et des
destructor
mais je ne vois pas en quoi... Merci infiniment d'éclairer ma lanterne. :)
<hr size="2" width="100%" />
program ptest;
{$APPTYPE CONSOLE}
uses
SysUtils,
classes,
test in 'test.pas';
var
v : TMaClasse;
begin
v.Create;
v.init;
v.Destroy;
end.
<hr size="2" width="100%" />
unit test;
interface
uses
SysUtils,classes;
type
TMaClasse = class
Private
x : ^integer;
Protected
Public
procedure init;
function setx : integer;
constructor Create;
destructor Destroy; override;
Published
end;
implementation
constructor TMaClasse.Create;
begin
GetMem(x,SizeOf(integer));
end;
procedure TMaClasse.init;
begin
x^:=2;
end;
function TMaClasse.setx : integer;
begin
result:= x^;
end;
destructor TMaClasse.Destroy;
begin
FreeMem(x,SizeOf(integer));
inherited;
end;
end.
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 31 déc. 2007 à 14:45
Salut !
Oulaaaa, normal que ça marche pas !
Quand tu appelles un constructeur, c'est comme si tu avais une fonction qui te retourne une instance de ta classe (un objet quoi !)
Donc V.Create appelle cette méthode de classe. Mais V n'a aucune valeur à ce moment.
Tu dois donc le créer autrement:
V := TMaClasse.Create;
Avec ceci, tu stockes les résultat du constructeur dans V.
Et après tu peux faire V.Init, V.Destroy, V.tout_ce_que_tu_veux, ...
Deuxièmement, pas la peine de t'embetter avec les pointeurs dans une classe.
Tu peux tout simplement faire:
<hr size="2" width="100%" /> type
TMaClasse = class(TObject) // Le TObject ici n'est pas obligatoire
private FX: Integer; // On prend l'habitude de préfixer les membres d'une classe par un "F"
public
constructor Create;
property X: Integer read FX write FX; // Création d'une propriété qui va permettre de lire et éccrire la valeur de FX
end;
implementation
constructor TMaClasse.Create;
begin
inherited; // Trèèès important: permet à Delphi d'initialiser toutes tes variables et d'allouer dynamiquement leur mémoire.
X := 2; // X est automatiquement crée, tu peux donc lui assigner une valeur directement.
end;
// Pas besoin de Destroy puisque le type Integer est géré nativement: auto construit, et auto détruit.
// Il en a de même pour tous les autres types scalaires, les record, les chaînes (longues ou courtes) et les tableaux à taille fixe.
<hr size ="2" width="100%" />
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 31 déc. 2007 à 14:49
Petite correction: dans le constructeur, bien qu'ici ce soit équivalent, il vaut mieux mettre "FX := 2" et non pas "X".
On préfère utiliser les membres d'une classe au sein de ses propres méthodes.
En espérant avoir été clair.