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;
}