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

C++Builder Discussion :

Deux Classes avec le même nom déclaré dans Deux CPP différents [Langage/Algorithme]


Sujet :

C++Builder

  1. #1
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut Deux Classes avec le même nom déclaré dans Deux CPP différents
    Deux Classes avec le même nom déclaré dans Deux CPP différents

    Selon vous, est-ce un bug ?
    Pour info c'est dans XE2 Update 4, j'ai pas testé avec d'autres versions

    J'ai DEUX CPP :
    - TFormMachin
    - TFormBidule

    Dans chaque CPP , j'ai déclaré un TComboObj
    TComboObj est interne au CPP, aucune référence dans le H
    TComboObj est ajouté par Items->AddObject et utilisé par Items->Objects[]Le but étant d'avoir un objet contenant des infos permettant de gérer des Items de ComboBox


    Dans TFormMachin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class TComboObj : public TObject
    {
    public:
      /*constructor*/__fastcall TComboObj(const AnsiString AIdent)
        : Ident(AIdent) {ShowMessage("TFormMachin::" + ClassName());}
     
      // Membres Publiques
      AnsiString Ident;
     
        /*destructor*/virtual __fastcall ~TComboObj() {ShowMessage("TFormMachin::~" + ClassName());}
    };
    Dans TFormBidule
    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
     
    class TComboObj : public TObject
    {
    public:
      /*constructor*/__fastcall TComboObj(const AnsiString AIdent)
        : Code(0),
          Ident(AIdent) {ShowMessage("TFormBidule::" + ClassName() + "(s)");}
     
      /*constructor*/__fastcall TComboObj(const int ACode, const AnsiString AIdent)
        : Code(ACode),
          Ident(AIdent) {ShowMessage("TFormBidule::" + ClassName() + "(i, s)");}
     
      // Membres Publiques
      int Code;
      AnsiString Ident;
     
        /*destructor*/virtual __fastcall ~TComboObj() {ShowMessage("TFormBidule::~" + ClassName());}
    };
    Pour tester :

    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
     
    void __fastcall TFormMachin::FormDblClick(TObject *Sender)
    {
      TComboObj* obj = new TComboObj(-1); // ShowMessage TFormMachin::TComboObj
      delete obj; // TFormMachin::~TComboObj
    }
     
    void __fastcall TFormBidule::FormDblClick(TObject *Sender)
    {
      TComboObj* obj = new TComboObj(-1, "Mon Bidule"); // ShowMessage TFormBidule::TComboObj(i, s)
      try {delete obj;} // ShowMessage TFormMachin::~TComboObj
      catch(const Exception &e) {ShowMessage("Mon Bidule " + e.Message);} // VA pour destruction de la Chaine
     
      TComboObj* obj2 = new TComboObj("Mon autre Bidule"); // ShowMessage TFormMachin::TComboObj ???
      delete obj2; // TFormMachin::~TComboObj ???
    }
    Joli, il se trompe de destructeur, histoire d'obj !
    Il se trompe même de constructeur si même paramètre !
    La liaison des OBJ a fait des merveilles !
    Il pourrait signaler un problème, au moins un warning !

    Si vous pensez que c'est un bug ou un manque d'info du lieur, j'irais le mettre dans le Quality Central
    Si vous pensez que c'est une erreur de conception, c'est pas totalement faux, j'avais du code dupliqué pouvant être refactoré


    En définissant un namespace ou un nom de classe différente, cela résout évidemment le problème !
    Personnellement, j'ai déplacé mon code dans une unité commune utilisée par les différentes TForm utilisant des Combo (toujours associé à un Ident Chaine et à une énumération)

    J'ai refactoré mon code pour éviter ce problème éviter les doublons surtout pour TIdentObjConnectionQuality (utilisé deux fois mais codé différement deux fois pour le même résultat)

    le code suivant pour les curieux, les textes sont dans un fichier de lang
    Ident c'est un code texte équivalent à un System.TypInfo.GetEnumValue\GetEnumName mais en utilisant System.Classes.IdentToInt\IntToIdent
    C'est plus léger que les template GET_ENUM_TYPEINFO\DECLARE_ENUM_TYPEINFO

    TIdentObjConnectionQuality est utilisé dans DEUX TForm, je n'ai plus de code en double, c'est nettement plus propre
    TIdentObjTestConnectionDepth est utilisé dans une seule TForm

    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
     
    //---------------------------------------------------------------------------
    #ifndef ShaiDVRDahuaTechnology_IHM_UtilsH
    #define ShaiDVRDahuaTechnology_IHM_UtilsH
    //---------------------------------------------------------------------------
    #include <vcl.h>
    //---------------------------------------------------------------------------
    #include "ShaiDVRDahuaTechnologyLibraryClasses.h"
    //---------------------------------------------------------------------------
     
    /* Forward Declarations */
    class TShaiLang;
     
    namespace ShaiDVRDahuaTechnology
    {
    namespace IHM_Utils
    {
    //---------------------------------------------------------------------------
    //            ShaiDVRDahuaTechnology::IHM_Utils::TComboManager             -
    //---------------------------------------------------------------------------
    class TComboManager : public TObject
    {
    public:
      // Méthodes publiques
      static void FillCombo(TComboBox *ACombo, TClass AClass, int CurrentValue, int LowValue, int Count, TShaiLang *AShaiLang);
      static void ClearCombo(TComboBox *ACombo);
    };
     
    //---------------------------------------------------------------------------
    //              ShaiDVRDahuaTechnology::IHM_Utils::TIdentObj               -
    //---------------------------------------------------------------------------
    class TIdentObj : public TObject
    {
    public:
      /*constructor*/__fastcall TIdentObj(const AnsiString AIdent)
        : Ident(AIdent) {}
     
      // Membres Publiques
      AnsiString Ident;
    };
     
    //---------------------------------------------------------------------------
    //      ShaiDVRDahuaTechnology::IHM_Utils::TIdentObjConnectionQuality      -
    //---------------------------------------------------------------------------
    class TIdentObjConnectionQuality : public TIdentObj
    {
    public:
      // Constructeurs Publiques
      /*constructor*/__fastcall TIdentObjConnectionQuality(int AValue)
        : TIdentObj(TShaiDVRDahuaTechnologyClientManager::ConnectionQualityToIdent((TShaiDVRDahuaTechnologyConnectionQuality)AValue)),
          Value((TShaiDVRDahuaTechnologyConnectionQuality)AValue) {}
     
      // Membres Publiques
      TShaiDVRDahuaTechnologyConnectionQuality Value;
    };
     
    //---------------------------------------------------------------------------
    //     ShaiDVRDahuaTechnology::IHM_Utils::TIdentObjTestConnectionDepth     -
    //---------------------------------------------------------------------------
    class TIdentObjTestConnectionDepth : public TIdentObj
    {
    public:
      // Constructeurs Publiques
      /*constructor*/__fastcall TIdentObjTestConnectionDepth(int AValue)
        : TIdentObj(TShaiDVRDahuaTechnologyClientManager::TestConnectionDepthToIdent((TShaiDVRDahuaTechnologyTestConnectionDepth)AValue)),
          Value((TShaiDVRDahuaTechnologyTestConnectionDepth)AValue) {}
     
      // Membres Publiques
      TShaiDVRDahuaTechnologyTestConnectionDepth Value;
    };
     
    //---------------------------------------------------------------------------
    //           ShaiDVRDahuaTechnology::IHM_Utils::TIdentObjFactory           -
    //---------------------------------------------------------------------------
    typedef TClass TIdentObjClass;
    class TIdentObjFactory : public TObject
    {
    public:
      // Fabrique d'instance
      static TIdentObj* Create(TIdentObjClass AClass, int AValue);
    };
    }; /* namespace IHM_Utils */
    }; /* namespace ShaiDVRDahuaTechnology */
    //---------------------------------------------------------------------------
     
     
     
     
    //---------------------------------------------------------------------------
    #endif
    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
     
    //---------------------------------------------------------------------------
    #pragma hdrstop
    //---------------------------------------------------------------------------
    #include "ShaiDVRDahuaTechnology_IHM_Utils.h"
    //---------------------------------------------------------------------------
    #include "ShaiLang.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
     
    //---------------------------------------------------------------------------
    //            ShaiDVRDahuaTechnology::IHM_Utils::TComboManager             -
    //---------------------------------------------------------------------------
    using ::ShaiDVRDahuaTechnology::IHM_Utils::TComboManager;
     
    //---------------------------------------------------------------------------
    /*static*/ void TComboManager::FillCombo(TComboBox *ACombo, TClass AClass, int CurrentValue, int LowValue, int Count, TShaiLang *AShaiLang)
    {
      ACombo->ItemIndex = -1;
      for (int i = LowValue; i < Count; i++)
      {
        TIdentObj *Ident = TIdentObjFactory::Create(AClass, i);
        String IdentText = AShaiLang->Translate(Ident->Ident, AClass->ClassName());
        ACombo->Items->AddObject(IdentText, Ident);
        if (CurrentValue == i)
          ACombo->ItemIndex = ACombo->Items->Count - 1;
      }
    }
     
    //---------------------------------------------------------------------------
    /*static*/ void TComboManager::ClearCombo(TComboBox *ACombo)
    {
      for (int i = 0; i < ACombo->Items->Count; i++)
        delete ACombo->Items->Objects[i];
     
      ACombo->Items->Clear();
    }
     
    //---------------------------------------------------------------------------
    //           ShaiDVRDahuaTechnology::IHM_Utils::TIdentObjFactory           -
    //---------------------------------------------------------------------------
    using ::ShaiDVRDahuaTechnology::IHM_Utils::TIdentObj;
    using ::ShaiDVRDahuaTechnology::IHM_Utils::TIdentObjClass;
    using ::ShaiDVRDahuaTechnology::IHM_Utils::TIdentObjFactory;
     
    //---------------------------------------------------------------------------
    /*static*/ TIdentObj* TIdentObjFactory::Create(TIdentObjClass AClass, int AValue)
    {
      // équivalent C++ du code Delphi "Result := AClass.Create(AValue);"
      TIdentObj *Result = NULL;
      if (AClass == __classid(TIdentObjConnectionQuality))
        Result = new TIdentObjConnectionQuality(AValue);
      else if (AClass == __classid(TIdentObjTestConnectionDepth))
        Result = new TIdentObjTestConnectionDepth(AValue);
      return Result;
    }
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  2. #2
    Membre actif Avatar de Argol_Medusa
    Homme Profil pro
    Ingénieur Radiofréquences
    Inscrit en
    Août 2005
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Radiofréquences
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 208
    Points : 242
    Points
    242
    Par défaut
    Je suppose que tu as bien vérifié en cleanant avant de compiler histoire de ne pas attraper des liaisons à des objets anciens que le compilo penserait ne pas avoir besoin de recompiler,ceci pouvant expliquer cela.

    Il faut être certain avant de leur envoyer ( histoire de pas passer pour ... ), mais tel que tu le décris oui c'est un bug techniquement parlant, clairement.

    Par contre personnellement je me verrais mal leur expliquer que je l'ai trouvé en déclarant 2 classes de meme nom dans 2 cpp différents, je vois arriver le commentaire "et je peux savoir pourquoi vous avez fait ça???" ben .... heu ....

    Après c'est plus une histoire de relations humaines que de technique.

    Je peux tester de mon coté si tu veux pour confirmation du bug.
    Désolé, on savait pas que c'était impossible, alors on l'a fait

  3. #3
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut ShaiLeTroll
    Je ne sais pas si cela a de l'importance tes deux classes sont declarees en public, est ce qu'elles peuvent etre declarees en private, est ce que cela supprimerait le probleme
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Citation Envoyé par Argol_Medusa Voir le message
    Je suppose que tu as bien vérifié en cleanant avant de compiler histoire de ne pas attraper des liaisons à des objets anciens que le compilo penserait ne pas avoir besoin de recompiler,ceci pouvant expliquer cela.
    Tout à fait, dans le projet d'origine, tu as un EXE qui appel un DLL qui en appel une seconde
    les TForm sont dans les DLL et intégrés comme des Frames dans l'EXE (propriété Parent, BorderStyle...), donc utilisation de Package et RTL Dynamique !

    En fait, j'ai reproduit le code dans un Exe tout neuf, si je le peux, je teste toujours dans un exe à part !

    Citation Envoyé par Argol_Medusa Voir le message
    Il faut être certain avant de leur envoyer ( histoire de pas passer pour ... ), mais tel que tu le décris oui c'est un bug techniquement parlant, clairement..
    Cela n'est pas mon 1er QC ! Je suis même passé par la case Beta Test de XE2, j'ai vite remonter des trucs sur printf, format, try..catch, interface et Supports ... tous les trucs qui était doit déjà buggé (il est bien connu qu'une correction de bug en provoque un autre)

    Citation Envoyé par Argol_Medusa Voir le message
    Par contre personnellement je me verrais mal leur expliquer que je l'ai trouvé en déclarant 2 classes de meme nom dans 2 cpp différents, je vois arriver le commentaire "et je peux savoir pourquoi vous avez fait ça???" ben .... heu ....
    Parce qu'ils le font !
    TMessageForm dans FMX.Dialogs.pas ET TMessageForm dans VCL.Dialogs.pas
    On peut même voir qu'ils ont copié celle de la VCL vers FMX en mettant en commentaire ce qui était en trop !
    C'est même ce qui m'a inspiré il y a des années, j'avais vu par hasard TMessageForm dans la section implementation (équivalent du CPP), c'est là que j'ai découvert que l'on pouvait déclarer une classe cachée !

    et j'ai pensé au namespace parce qu'ils ont ouvert les hostilités en premier avec TButton et TButton

    En Delphi, il y a même une tricherie qui consiste à écrire ceci
    Code pascal : 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
    type
      TButton = class(StdCtrls.TButton)
      private
        FMessage : string;
        class var FCount: Integer;
      public
        constructor Create(AOwner: TComponent); override;
      end;
     
    constructor TButton.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
     
      Inc(Self.FCount);
     
      FMessage := Format('%d Instances de %s (%d + %d = %d)', 
        [Self.FCount, Self.ClassName, StdCtrls.TButton.InstanceSize, sizeof(FMessage), Self.InstanceSize]);
     
      OutputDebugString(PChar(FMessage));
    end;

    que l'on peut utilisé en c++
    Une Macro pour que le Builder soit berné
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define TButton Controldelphiimpl::TButton
    Les TButton dans la TForm seront les TButton modifié qui affiche durant son constructeur notre petit message


    Citation Envoyé par Argol_Medusa Voir le message
    Après c'est plus une histoire de relations humaines que de technique.

    Je peux tester de mon coté si tu veux pour confirmation du bug.
    Sur QC, j'ai souvent eu Tomohiro Takahashi comme répondant, il est effectivement sans pitié

    Si tu veux tester, vas-y !



    Citation Envoyé par blondelle Voir le message
    Salut ShaiLeTroll
    Je ne sais pas si cela a de l'importance tes deux classes sont declarees en public, est ce qu'elles peuvent etre declarees en private, est ce que cela supprimerait le probleme
    Pas de différence !
    Mais note que ces classes sont déclarés dans le CPP !
    Donc ne sont visibles QUE dans le CPP et nulle-part ailleurs !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 379
    Points
    20 379
    Par défaut
    Salut, est-tu certain que TComboObject ne soit pas "encapsulé" dans les classes des deux fiches .cpp différentes ?
    Regarder dans le main() ,les fiches sont peut-être chargées en exécution
    Parce que sinon je ne comprends pas pourquoi C++ Builder ne fait pas la distinction

    Dans chaque CPP , j'ai déclaré un TComboObj
    TComboObj est interne au CPP, aucune référence dans le H
    d'accord mais on n'a pas assez de code
    Si tu as une TFormMachin le fichier .h doit ressembler à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class TFormMachin :TForm
    {
     
    };
    est-ce que TComboObj est déclaré avant ou après TFormMachin ?


    Citation Envoyé par ShaiLeTroll Voir le message
    Selon vous, est-ce un bug ?
    Pour info c'est dans XE2 Update 4, j'ai pas testé avec d'autres versions

    J'ai DEUX CPP :
    - TFormMachin
    - TFormBidule
    je ne pense pas que ce soit un bug....c'est à vérifer mais en C/C++ tu peux très bien déclarer un type dans un fichier source et le même dans un autre fichier .cpp
    Là où ça va coincer c'est si tu utilises le mot clé extern..

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    Salut, est-tu certain que TComboObject ne soit pas "encapsulé" dans les classes des deux fiches .cpp différentes ?
    Je ne comprends pas la question !

    Le code du PREMIER TComboObj est dans un PREMIER CPP (en plein milieu) comme ceci

    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
    //---------------------------------------------------------------------------
    class TComboObj : public TObject
    {
    public:
      /*constructor*/__fastcall TComboObj(const AnsiString AIdent)
        : Ident(AIdent) {ShowMessage("TFormMachin::" + ClassName());}
     
      // Membres Publiques
      AnsiString Ident;
     
        /*destructor*/virtual __fastcall ~TComboObj() {ShowMessage("TFormMachin::~" + ClassName());}
    };
     
     
    void __fastcall TBeginningCPPMainForm::FormDblClick(TObject *Sender)
    {
      TComboObj* obj = new TComboObj(-1); // ShowMessage TFormMachin::TComboObj
      delete obj; // TFormMachin::~TComboObj
    }
    //---------------------------------------------------------------------------
    et un AUTRE CPP avec un AUTRE TComboObj (pareil en plein milieu du CPP)

    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
     
     
    class TComboObj : public TObject
    {
    public:
      /*constructor*/__fastcall TComboObj(const AnsiString AIdent)
        : Code(0),
          Ident(AIdent) {ShowMessage("TFormBidule::" + ClassName() + "(s)");}
     
      /*constructor*/__fastcall TComboObj(const int ACode, const AnsiString AIdent)
        : Code(ACode),
          Ident(AIdent) {ShowMessage("TFormBidule::" + ClassName() + "(i, s)");}
     
      // Membres Publiques
      int Code;
      AnsiString Ident;
     
        /*destructor*/virtual __fastcall ~TComboObj() {ShowMessage("TFormBidule::~" + ClassName());}
    };
     
    void __fastcall TLanguageBasicsForm::FormDblClick(TObject *Sender)
    {
      TComboObj* obj = new TComboObj(-1, "Mon Bidule"); // ShowMessage TFormBidule::TComboObj(i, s)
      try {delete obj;} // ShowMessage TFormMachin::~TComboObj
      catch(const Exception &e) {ShowMessage("Mon Bidule " + e.Message);} // VA pour destruction de la Chaine
     
      TComboObj* obj2 = new TComboObj("Mon autre Bidule"); // ShowMessage TFormMachin::TComboObj ???
      delete obj2; // TFormMachin::~TComboObj ???
    }
    Citation Envoyé par Mat.M Voir le message
    Regarder dans le main() ,les fiches sont peut-être chargées en exécution
    TBeginningCPPMainForm créé par le Main
    TLanguageBasicsForm créé par un bouton sur TBeginningCPPMainForm



    Citation Envoyé par Mat.M Voir le message
    d'accord mais on n'a pas assez de code
    je ne vois pas quoi ajouter !
    J'ai mis tout le code que j'avais à disposition, il te suffit de créer deux form, de mettre dans chacune l'une ou l'autre variante et le code d'appel dans le OnDblClick !

    Citation Envoyé par Mat.M Voir le message
    est-ce que TComboObj est déclaré avant ou après TFormMachin ?
    TComboObj est DANS le CPP !
    en plein milieu, la déclaration de TFormMachin c'est dans le H !
    Donc bien après !



    Citation Envoyé par Mat.M Voir le message
    je ne pense pas que ce soit un bug....c'est à vérifer mais en C/C++ tu peux très bien déclarer un type dans un fichier source et le même dans un autre fichier .cpp
    tu te contredis !
    On peut effectivement déclarer un type dans un CPP et le même dans un autre, mais le bug c'est qu'il les confondent !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 379
    Points
    20 379
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    tu te contredis !
    On peut effectivement déclarer un type dans un CPP et le même dans un autre, mais le bug c'est qu'il les confondent !
    ehhh faut pas s'énerver comme ça !
    Je ne comprends pas ton énervement, faut rester zen..
    J'écris juste les idées qui me viennent à l'esprit...

    bon ceci mis en parenthése si le compilateur/éditeur de lien fait la confusion je pense que ça vient de l'éditeur de lien et du MAKEFILE généré mais je ne suis pas certain.

  8. #8
    Membre régulier
    Inscrit en
    Août 2010
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 123
    Points : 93
    Points
    93
    Par défaut
    Effectivement j'ai rencontré le même problème une fois, et j'ai mis un bon moment à comprendre ce qui se passait. En général, ça fait boom d'ailleurs.

    Depuis je fais vraiment attention, et j'utilise des namespaces.

    Pour moi c'est évidement un défaut, car les éléments déclarés dans un CPP ne devraient pas être visibles à l'extérieur (compilation et exécution). Donc tu as bien fait de le signaler à QC. Après ça pourrait être compliqué à modifier dans leur compilateur...

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    J'ai pas encore eu le temps de faire la QC.
    Je vais d'abord tester avec des objets c++ strict et non TObject pour voir ce que cela donne !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/03/2013, 12h58
  2. Réponses: 5
    Dernier message: 23/09/2011, 16h45
  3. Utilisation de deux classes ayant le même nom
    Par Oosoos dans le forum Langage
    Réponses: 1
    Dernier message: 29/12/2010, 17h40
  4. Réponses: 7
    Dernier message: 29/08/2008, 12h16
  5. Deux instances avec le même nom.
    Par Denn's dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 14/03/2008, 09h09

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