J'ai deux classes qui vont créer un cstring dynamiquement alloué (null terminé) de taille n sur un objet de cette classe en cours de création. Dans une classe, j'ai une fonction de membre surchargeant l'opérateur d'équivalence, et dans l'autre classe, j'ai une fonction non-membre surchargeant l'opérateur d'équivalence. J'utilise strcmp pour comparer deux chaînes de chaque type de classe, et peu importe ce que j'initialise le tableau, il retourne toujours vrai.Ces deux chaînes de tailles différentes doivent-elles renvoyer 0 (égal) avec strcmp?
int main() {
CSTR cstr(5);
CSTR cstr2(6);
if (cstr == cstr2)
cout << "Equal"; //<< Always returns true
else
cout << "False";
cout << "\n\n";
CSTR2 cstr2_1(5);
CSTR2 cstr2_2(6);
if (cstr2_1 == cstr2_2)
cout << "Equal"; //<< Always returns true
else
cout << "False";
return 0;
}
==============================
class CSTR {
public:
CSTR();
CSTR(unsigned int n);
~CSTR();
bool operator ==(const CSTR & rhs);
private:
unsigned int size;
char *elems;
};
============================
CSTR::CSTR() {
size = 0;
elems = new char [0];
}
CSTR::CSTR(unsigned int n) {
if (n > 0) {
size = n;
elems = new char [size];
}
else {
size = 0;
elems = new char [0];
}
}
CSTR::~CSTR() {
delete [] elems;
}
bool CSTR::operator ==(const CSTR & rhs) { //<< Always returns true
return (strcmp(elems, rhs.elems) == 0);
}
===========================================
class CSTR2 {
public:
CSTR2();
CSTR2(unsigned int n);
~CSTR2();
char * getCstrPtr() const;
private:
unsigned int size;
char *elems;
};
bool operator ==(const CSTR2 & CSTR2_1, const CSTR2 & CSTR2_2);
========================================
CSTR2::CSTR2() {
size = 0;
elems = new char [0];
}
CSTR2::CSTR2(unsigned int n) {
if (n > 0) {
size = n;
elems = new char [size];
}
else {
size = 0;
elems = new char [0];
}
}
CSTR2::~CSTR2() {
delete [] elems;
}
char * CSTR2::getCstrPtr() const {
return elems;
}
bool operator ==(const CSTR2 & CSTR2_1, const CSTR2 & CSTR2_2) { //<< Always returns true
return (strcmp(CSTR2_1.getCstrPtr(), CSTR2_2.getCstrPtr()) == 0);
}
Qu'est-ce que c'est? Vous comparez un couple de tableaux non initialisés et vous attendez des résultats significatifs? C'est drôle que vous ayez ressenti le besoin de gérer le cas 'n == 0' séparément dans le constructeur' CSTR', quand il fait exactement la même chose que le cas 'n> 0'. Votre classe ne suit pas la Règle des Trois. Utilisez ['std :: string'] (http://en.cppreference.com/w/cpp/string/basic_string) et arrêtez d'essayer de réinventer la roue sans raison. – Praetorian
Le comportement que vous voyez est ce que vous attendez si le code était correct. Cependant, l'opérateur de comparaison ne vérifie pas la longueur et le constructeur n'initialise pas la mémoire brute, donc le code n'est pas correct. Le premier point, que vous voyez à quoi vous devez vous attendre, est en soi suffisant pour rendre la question sans réponse. –
Croyez-moi, je ne cherche certainement pas à réinventer la roue. C'est pour une affectation matérielle que nous construisons et la seule information que j'ai jusqu'à présent est d'allouer de la mémoire pour les tableaux, puis de surcharger l'opérateur d'équivalence. J'ai creusé mon cerveau en essayant de comprendre à quel genre d'équivalence je suis supposé tester quand il n'y a pas encore de données établies. La partie la plus misérable de cette classe jusqu'à présent a été de faire toutes ces choses avec des chaînes quand tout le monde dit que c'est que je ne les utiliserai jamais. – Victor