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 :

Constructeur de classe [Free Pascal]


Sujet :

Free Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Par défaut Constructeur de classe
    Bonjour les pro du FreePascal,

    J'ai grandement besoin d'aide... ça va sûrement vous faire rire, mais ....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    {$MODE OBJFPC}
    PROGRAM Test;
     
    TYPE TMaClass = CLASS
    CONSTRUCTOR Init;
    END;
     
    CONSTRUCTOR TMaClass.Init;
    BEGIN
    END;
     
    BEGIN
    END.
    C'est on ne peut plus rudimentaire.. et pourtant j'obtiens ce message d'erreur complétement incongru :
    Error: Operation ">" not supported for types "Pointer" and "Pointer"
    La ligne indiquée est celle du BEGIN du constructeur.

    Heuuuu.... comment défini t-on un constructeur pour une classe ? J'ai tout essayé, et j'obtient toujours ce message d'erreur (le TurboPascal ne fonctionnait pas de cette manière, il utilisait OBJECT).

    Autre chose encore.

    Pour créer une instance, je doit faire TMaClass.Create : dans ces conditions, comment appeler le constructeur Init ? J'ai essayé new(TMaClass.Init), mais le compilateur refuse cette construction.

    Et si je fais new(TMaClass), le compilateur me dit qu'il attend un nom de type... parce que TMaClass n'est pas un identificateur de type ?

    C'est basique, je sais, mais c'est peut-être pour ça que la question vaut la peine d'être posée

    Et si je suis bête, c'est pas une raison pour me laisser m'endormir toujours si bête ce soir

    P.S. J'ai essayé d'autres directives {$MODE ...}, mais sans succés (DELPHI, FPC, etc).

  2. #2
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Par défaut La directive {$EXTENDEDSYNTAX-} / {$EXTENDEDSYNTAX+}
    Je viens à l'instant de trouver :

    Le problème vient de cette directive qui était active :
    Pourtant je ne vois pas le rapport. Cette directive interdit d'appeler les fonctions comme des procédures. Le constructeur n'est pas un cas particulier ?

    Quand même, je j'aime pas du tout cette possibilité d'ignorer la valeur renvoyée par une fonction... alors va pour des désactivation/réactivation de cette directive

    Je ne marque pas le problème comme résolu, parce que si quelqu'un a une autre idée, j'aimerais encore mieux (je tiens à $EXTENDEDSYNTAX-)

  3. #3
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 466
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    Il me semble que c'est la syntaxe Delphi qui définit les choses comme ça. Les conctructeurs s'appelent Create, et non plus Init, et ils ne s'appellent plus comme des méthodes d'instances mais comme des méthodes de classe. A confirmer

  4. #4
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Par défaut
    Citation Envoyé par wormful_sickfoot
    [...] Les conctructeurs s'appelent Create, et non plus Init [...]
    Salut,

    Beh, justement, c'est là qu'est le dernier problème que je n'arrive pas à résoudre.

    Si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TYPE TMaClass = CLASS
    CONSTRUCTOR Create;
    END;
    Si je fais cela, j'obtiens un message du compilateur, qui me dit que le constructeur doit obligatoirement s'appeler Init. C'est étrange, parce que le seul constructeur d'instantiation qu'il accepte, c'est Create. C'est fous

    En bref, il m'interdit de définir un constructeur qui s'appel Create, mais il n'accepte que TMaClass.Create comme expression d'instanciation.

    Si je défini un constructeur qui s'appel Init, et que j'instancie avec TMaClass.Init, il me l'interdit, et si j'instancie avec TMaClass.Create, j'ai vérifié que Init n'est malheureusement pas appelé. Aïe, aïe, aïe ...

    C'est peut-être un peu ça qui est compliqué avec FreePascal : il mélange tellement de choses.

    Comment dans l'exemple donné, puis-je définir un constructeur nomé Create, ou alors instancier avec Init ? (l'un ou l'autre au moins)

    J'avoue que je suis perdu avec cette aspect là, et que cette fois-ci (et cette fois-ci les directives ne semblent pas avoir d'influance... à moins que je n'ai pas trouvé la bonne)

  5. #5
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Par défaut l'option -Ss
    Je viens de découvrir par hasard la solution au dernier problème.

    Dans mon fichier fpc.cfg, figurait une option -Ss. Les -Sx sont des options contrôlant la syntaxe, et -Ss est une option imposant l'usage de Init et Done, respectivement pour les constructeur et destructeur.

    Il y a ici un bug de FreePascal, qui n'applique l'option qu'à la définition des classe, mais pas aux expressiosn d'instanciation.

    En effet, quand l'option -Ss est active, je constate que effectivement à la définition, Init et Done sont imposés, et tous autres nom sont rejetés. Mais FreePascal ne tient plus compte de l'option à l'invocation du constructeur, et continu à éxigé Create et Destroy comme constructeur et destructeur.

    L'option -Ss ne devrait donc pas être utilisée, à cause des incohérences qu'elle porte avec elle.

    Je n'ai pas trouvé de directive de compilation (du genre {$xxx}) pour contrôler cette option depuis les fichiers sources.

    Je pense que le sujet est maintenant suffisament mûre pour être marqué résolu, et que ces questions tatillones serviront à d'autres

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

Discussions similaires

  1. Constructeurs et classe de base virtuelle
    Par Paul Atreide dans le forum C++
    Réponses: 7
    Dernier message: 06/11/2006, 17h04
  2. Vector et constructeurs de classes
    Par insomniak dans le forum SL & STL
    Réponses: 13
    Dernier message: 13/05/2006, 21h15
  3. Réponses: 3
    Dernier message: 02/05/2006, 08h07
  4. [POO] Constructeur de classe
    Par cescu dans le forum Langage
    Réponses: 7
    Dernier message: 14/02/2006, 21h50
  5. Réponses: 7
    Dernier message: 15/07/2005, 15h07

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