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