Aides pour les classes.

Résolu
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.

3 réponses

florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
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%" />

Voila, j'espère t'avoir éclaircit l'esprit !
Petit lien en passant très intéressant, complet et explicite: http://fbeaulieu.developpez.com/guide/10-objets-1.html
A+
Flo

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body
3
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
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.

++

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body
0
Utilisateur anonyme
31 déc. 2007 à 15:15
Merci infiniment de ta réponse j'ai enfin compris ce qui me manquai ;)
0
Rejoignez-nous