IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

[POO] Problème avec un constructeur


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mars 2007
    Messages : 129
    Par défaut [POO] Problème avec un constructeur
    Bonjour à tous.

    (si je n'ai pas posté dans la bonne section, veuillez m'excuser)

    Voilà un bout de code sur lequel je bloque depuis plusieurs heures, et ce n'est pas faute d'avoir regardé des tutos...

    fichier Unit1.pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    unit Unit1;
     
    interface
     
    uses
      ...,  Unite;
     
    type
      TForm1 = class(TForm)
    ...
      end;
     
    var
    ...
      U : TUnite;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    ...
      U:=TUnite.Create();
    end;
     
    end.
    Fichier Unite.pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    unit Unite;
     
    interface
     
    uses Contnrs;
     
    type TUnite  = class
      public
        nom : String;
        image : string;
        uType : PChar;
        missileForce : integer;
        missile : integer;
        force : integer;
        armure : integer;
        PV : integer;
        taille : integer;
        Lancier : TUnite;
        constructor Create;
        function CompagnieMaxUnite() : integer;
    end;
     
    implementation
     
    constructor TUnite.Create;
    begin
      with Lancier do 
      begin
        nom := 'Lancier';           
        image := 'Lancier.bmp';       
        uType := 'InfanterieLegere';    
        missileForce := 0;    
        missile := 0;    
        force := 4;     
        armure := 0;    
        PV := 13;    
        taille := 1;  
      end;
    end;
     
    function TUnite.CompagnieMaxUnite() : integer;
    begin
      CompagnieMaxUnite := 30 div taille;
    end;
     
    end.
    Mon problème est celui-ci :
    Dans le premier fichier, unit1.pas, la ligne U:=TUnite.Create(); déclenche une violation d'accès... hors si je ne peux pas construire mon objet, je vais avoir du mal à l'utiliser ^^

  2. #2
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 400
    Par défaut
    Bonjour

    1. Dans unit1, enlève les parenthèse de Create lors de son appel puisque tu n'as pas de paramètre à passer;
    2. Dans unit, enlève Lancier du corps de Create (il ne sert à rien)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mars 2007
    Messages : 129
    Par défaut
    1. J'ai essayé avec ou sans les parenthèses, même effet : Violation d'accès
    2. En fait, Lancier est une "constante" que je compte appeler en faisant TUnite.Lancier, donc faut bien lui affecter des valeurs à un moment ou un autre, j'avais choisis le constructeur... mauvaise idée ? Il y aura d'ailleurs 7-8 autres "constantes" de ce genre dans TUnite

  4. #4
    Membre extrêmement actif
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 219
    Par défaut
    Bonjour,

    le problème est que Lancier est de type TUnite et que tu ne l'a pas instancié, d'où la violation d'accès.

    Pour faire ce que tu veux je verrai cette méthode :
    Tu déclare Lancier comme une property en lecture seule en l'instanciant dans le constructeur de la class et en oubliant pas de le libérer dans le destructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    unit Unit1; 
     
    interface
     
    uses
      Classes, SysUtils;
     
    type
     
      { TUnite }
     
      TUnite = class
      private
        Farmure: integer;
        Fforce: integer;
        Fimage: string;
        FLancier: TUnite;
        Fmissile: integer;
        FmissileForce: integer;
        Fnom: String;
        FPV: integer;
        Ftaille: integer;
        FuType: PChar;
        procedure Setarmure(const AValue: integer);
        procedure Setforce(const AValue: integer);
        procedure Setimage(const AValue: string);
        procedure Setmissile(const AValue: integer);
        procedure SetmissileForce(const AValue: integer);
        procedure Setnom(const AValue: String);
        procedure SetPV(const AValue: integer);
        procedure Settaille(const AValue: integer);
        procedure SetuType(const AValue: PChar);
      public
        constructor Create;
        destructor Destroy; override;
        property Lancier : TUnite read FLancier;
        property nom : String read Fnom write Setnom;
        property image : string read Fimage write Setimage;
        property uType : PChar read FuType write SetuType;
        property missileForce : integer read FmissileForce write SetmissileForce;
        property missile : integer read Fmissile write Setmissile;
        property force : integer read Fforce write Setforce;
        property armure : integer read Farmure write Setarmure;
        property PV : integer read FPV write SetPV;
        property taille : integer read Ftaille write Settaille;
      end;
     
    implementation
     
    { TUnite }
     
    procedure TUnite.Setarmure(const AValue: integer);
    begin
      if Farmure=AValue then exit;
      Farmure:=AValue;
    end;
     
    procedure TUnite.Setforce(const AValue: integer);
    begin
      if Fforce=AValue then exit;
      Fforce:=AValue;
    end;
     
    procedure TUnite.Setimage(const AValue: string);
    begin
      if Fimage=AValue then exit;
      Fimage:=AValue;
    end;
     
    procedure TUnite.Setmissile(const AValue: integer);
    begin
      if Fmissile=AValue then exit;
      Fmissile:=AValue;
    end;
     
    procedure TUnite.SetmissileForce(const AValue: integer);
    begin
      if FmissileForce=AValue then exit;
      FmissileForce:=AValue;
    end;
     
    procedure TUnite.Setnom(const AValue: String);
    begin
      if Fnom=AValue then exit;
      Fnom:=AValue;
    end;
     
    procedure TUnite.SetPV(const AValue: integer);
    begin
      if FPV=AValue then exit;
      FPV:=AValue;
    end;
     
    procedure TUnite.Settaille(const AValue: integer);
    begin
      if Ftaille=AValue then exit;
      Ftaille:=AValue;
    end;
     
    procedure TUnite.SetuType(const AValue: PChar);
    begin
      if FuType=AValue then exit;
      FuType:=AValue;
    end;
     
    constructor TUnite.Create;
    begin
      inherited;
     
      FLancier := TUnite.Create;
      with FLancier do
      begin
        nom := 'Lancier';
        image := 'Lancier.bmp';
        uType := 'InfanterieLegere';
        missileForce := 0;
        missile := 0;
        force := 4;
        armure := 0;
        PV := 13;
        taille := 1;
      end;
    end;
     
    destructor TUnite.Destroy;
    begin
      FLancier.Free;
     
      inherited Destroy;
    end;
     
    end.
    @++
    Dany

  5. #5
    Membre chevronné Avatar de archonte
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 343
    Par défaut
    Peut-on créer un classe qui s'appelle elle-même (lancier = TUnite) ?


    Edit : Grillé !

  6. #6
    Membre extrêmement actif
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 219
    Par défaut
    Mais tu n'as pas tord, ceci est possible, mais pas trop orthodoxe je trouve. Perso j'aurai plutôt utilisé une méthode de class qui m'aurait instanciée un objet de type TUnité pré-chargé des valeurs voulues, maintenant tout dépend de ce qu'il veut faire exactement.

    @++
    Dany

  7. #7
    Membre chevronné Avatar de archonte
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 343
    Par défaut
    Si l'on réfléchit en français : pour moi, le lancier est un membre d'une unité ou d'une compagnie . Donc ces données ne sont pas sur le même niveau de regroupement. En POO, je pense donc qu'il manque une organisation hiérarchisée des données dans une Tcollection ou équivalent :

    TCompagnie
    _TUnite
    __TLancier

    ou
    TUnite
    _TCompagnie
    __TLancier

    (excusez mes faibles connaissances militaires)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Debutant] Problème avec un constructeur par copie
    Par Drannor dans le forum Débuter
    Réponses: 5
    Dernier message: 12/03/2007, 09h15
  2. [POO] Problème avec $this de PHP4 à PHP5
    Par c4l3m dans le forum Langage
    Réponses: 19
    Dernier message: 16/02/2007, 09h48
  3. [POO] Problème avec setInterval/méthodes d'écriture
    Par Lpu8er dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/07/2006, 15h37
  4. [Conception]Problèmes avec un constructeur dérivé
    Par Le Furet dans le forum Langage
    Réponses: 6
    Dernier message: 10/03/2006, 09h44
  5. [POO] Problème avec l'utilisation de classes.
    Par sekiryou dans le forum Langage
    Réponses: 3
    Dernier message: 16/02/2006, 18h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo