2014-07-18 3 views
-2

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); 
} 
+4

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

+0

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. –

+0

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

Répondre

1

Vous n'avez pas initialisées le contenu de ces tampons vous new ed up. Ils peuvent contenir quoi que ce soit. Si les deux buffers que vous avez alloués ont tous les deux commencé par '\0', alors strcmp diraient en effet qu'ils sont égaux (puisqu'ils sont tous les deux considérés comme des chaînes de longueur nulle).

Aussi, je suis d'accord avec tout dans le commentaire de Praetorian, en particulier sur la Règle de Trois.

+0

Merci Chris! C'est pour une mission sur laquelle nous allons nous appuyer pendant le week-end. Tout ce que je sais à ce jour est de créer ce que j'ai et surcharger l'opérateur d'équivalence pour chaque classe. Je ne savais pas si strcmp devrait retourner 0 ou pas quand tout ce que je devais quitter était la taille du tableau. – Victor

+0

Une autre raison possible du comportement vu, serait que le code était correct. Nous pouvons voir que ce n'est pas le cas. Mais la solution la plus probable n'est pas d'initialiser le contenu du tableau, mais plutôt d'avoir des longueurs de contrôle de comparaison d'égalité, puisque les longueurs sont représentées explicitement. –

+0

@Alf: Bien sûr, je suis d'accord que les longueurs doivent être vérifiées en premier, mais dans ce cas, nous ne traitons plus les chaînes "C". Les comparaisons devraient alors utiliser 'memcmp'. –

Questions connexes