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

Free Pascal Discussion :

Interface, référence et destructeur [Free Pascal]


Sujet :

Free Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    641
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 641
    Par défaut Interface, référence et destructeur
    Bonjour,

    J'ai le code suivant :
    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
        { IAgent }
     
    IAgent = interface
            procedure Notify(AMarket : TMarket; AAct : Char; ACommodity : Integer; APrice : Single; ASuccess : Boolean);
            procedure UpdateInventory(const ACommodity : Integer; const ADelta : Integer);
            procedure UpdateMoney(const ADelta : Single);
        end;
     
        { TOffer }
     
        TOffer = class
            { Commodity }
            FCommodity : Integer;
            { Agent }
            FAgent : IAgent;
            { Quantity }
            FQuantity : Integer;
            { Price }
            FPrice : Single;
            { Class constructor }
            constructor Create(ACommodity : Integer; AAgent : IAgent; AQuantity : Integer; APrice : Single);
        end;
     
        TSimpleAgent = class(TInterfacedObject, IAgent)
            procedure Notify(AMarket : TMarket; AAct : Char; ACommodity : Integer; APrice : Single; ASuccess : Boolean);
            procedure UpdateInventory(const ACommodity : Integer; const ADelta : Integer);
            procedure UpdateMoney(const ADelta : Single);
        end;
     
        TMarket = class
        private
            { Buy offer books }
            FBuyOfferBooks : TOfferMap;
            { Sell offer books }
            FSellOfferBooks : TOfferMap;
            FDemands : TIntegerMap;
            FSupplies : TIntegerMap;
            FPrices : TSingleMap;
        public
            constructor Create;
            procedure AddBuyOffer(AOffer : TOffer);
            procedure AddSellOffer(AOffer : TOffer);
            procedure ResolveOffers(ACommodity : Integer);
            function GetAveragePrice(const ACommodity : Integer) : Single; virtual;
            function GetDemand(const ACommodity : Integer) : Integer;
            function GetSupply(const ACommodity : Integer) : Integer;
            destructor Destroy; override;
        end;
    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
     
        //une classe de test avec :
        FAgent := TSimpleAgent.Create;
     
        //offres d'achat
        FMarket.AddBuyOffer(TOffer.Create(WOOD, FAgent, 50, 2.8));
        FMarket.AddBuyOffer(TOffer.Create(WOOD, FAgent, 30, 3.2));
        FMarket.AddBuyOffer(TOffer.Create(WOOD, FAgent, 20, 2.7));
     
        //offres de vente
        FMarket.AddSellOffer(TOffer.Create(WOOD, FAgent, 40, 4.3));
        FMarket.AddSellOffer(TOffer.Create(WOOD, FAgent, 30, 3.2));
        FMarket.AddSellOffer(TOffer.Create(WOOD, FAgent, 20, 3.7));
        FMarket.ResolveOffers(WOOD);
     
        //2ème tour
        //offres d'achat
        FMarket.AddBuyOffer(TOffer.Create(WOOD, TMockAgent.Create, 60, 2.5));
    Je n'ai pas posté le code complet. Je compléterai si nécessaire.

    La classe TSimpleAgent implémente une interface IAgent.

    La méthode FMarket.ResolveOffers traite les offres et libère les objets TOffer.

    Tout fonctionne bien jusqu'à la fin de l'appel de ResolveOffers. Par contre lorsque j'appelle AddBuyOffer pour le deuxième tour j'obtiens une erreur (exception de class 'External: SIGSEGV').

    Je constate que le destructeur de TSimpleAgent est appelé.

    Si je crée un nouvel objet TSimpleAgent je n'ai pas cette erreur. Je n'ai pas d'erreur non plus si j'utilise une classe abstraite au lieu d'une interface.

    J'ai l'impression que le problème est lié au compteur de référence et la libération automatique des objets qui descendent de TInterfacedObject.

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    641
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 641
    Par défaut
    J'ai trouvé la solution : il ne faut pas mélanger objets et interfaces et n'utiliser que des interfaces.

    Au lieu de :
    il faut écrire :

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 14/10/2005, 20h53
  2. [VB6] [Interface] ComboBox à plusieurs colonnes
    Par mtl dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 30/03/2004, 17h35
  3. [VB6] [Interface] Horloge 7 segments
    Par selenay dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 07/10/2002, 16h15
  4. interface utilisateur avec OpenGL
    Par demis20 dans le forum OpenGL
    Réponses: 6
    Dernier message: 03/10/2002, 12h27

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