2010-08-19 11 views
3

Bon, je ne sais pas ce que je fais ici, sinon ce n'est pas correct. Essayer de surcharger la méthode '==' d'une classe, et ça ne marche pas. Au moins, je reçois un faux retour de mon main, et le cout dans l'implémentation de '==' ne produit pas.Difficulté pour obtenir la surcharge de l'opérateur '==' au travail (C++)

Ce sont mes trois fichiers:

// TestClass.h 

#ifndef TESTCLASS_H 
#define TESTCLASS_H 

class TestClass { 
public: 
    TestClass(int contents); 
    TestClass(const TestClass& orig); 
    virtual ~TestClass(); 
    bool operator==(const TestClass& other); 
private: 
    int contents; 
}; 

#endif /* TESTCLASS_H */ 



// TestClass.cpp 

#include <iostream> 

#include "TestClass.h" 

TestClass::TestClass(int contents) { 
    this->contents = contents; 
} 

TestClass::TestClass(const TestClass& orig) { 
    this->contents = orig.contents; 
} 

TestClass::~TestClass() { 
} 

bool TestClass::operator ==(const TestClass& other) { 
    std::cout << "COMPARING" << std::endl; 
    return (contents == other.contents); 
} 


// Main.cpp 

#include <cstdlib> 
#include <iostream> 

#include "TestClass.h" 

using namespace std; 

/* 
* 
*/ 
int main(int argc, char** argv) { 

    TestClass* tc = new TestClass(1); 
    TestClass* tc1 = new TestClass(1); 

    cout << (tc == tc1) << endl; 

    return 0; 
} 

La question est - ce que je fait de mal? Je m'excuse pour ce qui est probablement une erreur très stupide quelque part, mais je ne peux pas le voir.

+2

Vous devriez préférer une liste d'initialisation sur une affectation dans le constructeur, vous n'avez pas besoin de définir le constructeur de copie (encore une fois, utilisez une liste d'initialisation) car celui créé implicitement copiera chaque membre de toute façon, et vous ne devriez pas définir un destructeur vide. – GManNickG

+0

@GMan: +1 sur votre commentaire mais pour sa défense le destructeur est marqué comme virtuel, donc il doit être défini. Que la classe ait vraiment besoin d'un destructeur virtuel est une autre question bien sûr ... :) – Troubadour

+0

Désolé, le destructeur vient d'être généré par netbeans quand j'ai généré automatiquement la classe de test. Ne serait normalement pas là =). – Stephen

Répondre

11

tc == tc1 compare les valeurs de pointeur. Il "devrait" être *tc == *tc1, mais je ne comprends pas pourquoi vous allouer dynamiquement en premier lieu.

L'allocation automatique (pile) est fortement préférée, allouée uniquement dynamiquement lorsque l'objet doit être indépendant de la portée. (Et puis garder une trace de celui-ci avec des pointeurs intelligents attribués automatiquement, ce qui supprimera le pointeur quand il est approprié.)


En outre, l'opérateur doit être const, car il ne modifie pas this:

//          vvvvv 
bool operator==(const TestClass& other) const; 

mieux encore, cependant, est une fonction libre:

bool operator==(const TestClass& lhs, const TestClass& rhs); 

Ce qui serait peut-être un ami. (Les fonctions libres sont toujours préférées, plus cela permet au 5 == tc de fonctionner.)

+0

Merci pour la réponse. Je devrais vraiment avoir repéré le problème de pointeur, désolé. Cependant, votre réponse m'a aussi appris d'autres choses, et laissez-moi quelques questions - principalement sur cette allocation «dynamique» par opposition à «automatique». Pour être franc, je n'ai aucune idée de ce dont vous parlez - google pour 'allocation automatique C++' donne un premier résultat qui revendique l'allocation dynamique et automatique sont la même chose (http://www.cplusplus.com/forum/articles/416 /). Donc, désolé, mais de quoi parlez-vous vraiment? – Stephen

+0

@Stephen, ce que GMan fait référence à cela au lieu de dire 'TestClass * tc = new TestClass (1);' vous pouvez aussi écrire 'TestClass tc (1);' et il construira un objet avec la même valeur. C'est le moyen préféré en C++ sur new/delete. Vous avez également manqué la suppression de tc et tc1, donc ces objets ne seront jamais détruits. C++ n'a pas de garbage collector comme C# ou Java, vous devez vous-même sortir les ordures. –

+1

@Stephen: Ce lien n'a aucun sens (cette personne ne parvient évidemment pas à comprendre la différence entre le langage C++ et les implémentations). J'aimerais qu'il y ait un bouton super-supprimer sur internet. Dans tous les cas, dynamique, automatique et statique sont des durées de stockage *. Un automatique est la valeur par défaut, et les objets avec une durée automatique seront détruits automatiquement (d'où le nom) à la fin de leur portée. L'allocation dynamique est indépendante de la portée, et vous obtenez un pointeur vers un objet alloué dynamiquement via 'new' (et friends.) Si vous ne supprimez jamais manuellement un objet alloué dynamiquement ... – GManNickG

4

Vous comparez des pointeurs. Essayez qu'au lieu:

cout << (*tc == *tc1) << endl; 

Deux remarques:

  • Vous devez libérer la mémoire allouée à supprimer ou utiliser un pointeur intelligent
  • Vous devez déclarer opérateur == const:

    bool operator==(const TestClass& other) const

+1

Deux autres remarques: * 'operator ==' devrait être une fonction non-membre, et * bonne chance implémentation 'operator ==' avec polymorphisme dynamique: http://www.drdobbs.com/184405053 –

+0

+1 pour le non -member rappel – Chubsdad