2011-04-17 3 views
1

J'ai un peu de mal à utiliser des opérateurs surchargés dans un opérateur déjà surchargé. Dans mon code suivant, j'ai surchargé l'opérateur & & pour comparer deux objets de cours. L'opérateur va à son tour à une fonction qui appelle d'autres opérateurs surchargées pour comparer les variables d'objet privé de cet objet pour les comparer principalement:Surcharge d'un opérateur C++ dans un opérateur déjà surchargé

code:

bool operator&&(const DaysOfWeek& a, const DaysOfWeek& b); 
bool operator&&(const TimeInterval& a, const TimeInterval& b); 

Maintenant, pour ma question. J'ai utilisé de nombreux opérateurs surchargés dans ce projet, mais c'est la première fois que j'ai dû appeler des opérateurs surchargés à l'intérieur d'autres opérateurs surchargés. Malheureusement, mes opérateurs surchargés dans le code ci-dessus ne sont pas appelés depuis ma fonction isOverlap. Donc ma question est: pourquoi est-ce et comment puis-je le corriger?

Toute aide serait grandement appréciée, car je me tape la tête contre le mur en essayant de faire fonctionner cela. J'ai inclus le code relatif à Course.h et les fonctions et l'opérateur surchargé dans Course.cpp. J'ai mis en gras les lignes de code appropriées pour lesquelles j'ai une sortie irrégulière (n'utilisant pas mon opérateur surchargé).

code:

bool Course::isOverlap(const Course& b) const 
{ 
    DaysOfWeek tempDays = b.getDays(); 
    TimeInterval tempTime = b.getTime(); 
    if(this->instructor==b.getInstructor() && 
     &this->days&&(&tempDays) && 
     &this->time&&(&tempTime)) 
    { 
     return true; 
    } 
    else 
     return false; 
} 

bool operator&&(const Course& a, const Course& b) 
{ 
    if (a.isOverlap(b)) 
     return true; 
    else 
     return false; 
} 

code:

#ifndef COURSE_H 
#define COURSE_H 

#include <string> 
#include "TimeInterval.h" 
#include "DaysOfWeek.h" 

using namespace std; 

class Course 
{ 
    public: 
     Course(); 
     Course(const string courseCode, const string section, 
      const DaysOfWeek& days, const TimeInterval& time, 
      const string instructor); 
     void setCourse(string courseCode, string section, 
      DaysOfWeek& days, TimeInterval& time, string instructor); 
     string getCourse() const; 
     string getSection() const; 
     DaysOfWeek getDays() const; 
     TimeInterval getTime() const; 
     string getInstructor() const; 
     bool isOverlap(const Course& b) const; 
     bool isMatch(const Course& b) const; 

    private: 
     string courseCode; 
     string section; 
     DaysOfWeek days; 
     TimeInterval time; 
     string instructor; 
}; 

bool operator&&(const Course& a, const Course& b); 
bool operator==(const Course& a, const Course& b); 

#endif //COURSE_H 

J'ai aussi essayé de remplacer le code que j'ai avec:

bool Course::isOverlap(const Course& b) const 
{ 
    DaysOfWeek tempDays = b.getDays(); 
    TimeInterval tempTime = b.getTime(); 
    if(instructor==b.getInstructor() && 
     days && tempDays && 
     time && tempTime) 
    { 
     return true; 
    } 
    else 
     return false; 
} 

Comme un ami a suggéré, mais ce n » t même compiler (ne correspond pas aux arguments de la surcharge & & opérateur).

+0

Vous ne voulez vraiment pas surcharger l'opérateur '&&'. Voulez-vous surcharger '==', peut-être? –

+0

Non, je veux dire &&. Pour une affectation, je dois utiliser && pour tester le chevauchement. == pour une correspondance exacte. – Aurum

Répondre

3

Ce:

instructor==b.getInstructor() && days && tempDays && time && tempTime 

est équivalent à ceci:

(((((instructor==b.getInstructor()) && days) && tempDays) && time) && tempTime) 

premier instructor==b.getInstructor() est évalué, ce qui donne un bool. Ensuite, le compilateur voit && days et essaie de trouver une surcharge de && qui prend un bool et un DaysOfWeek. Il n'y en a pas, donc cela donne une erreur.

Pour utiliser votre surcharge && à côté le haut-&&, vous avez besoin des parenthèses pour forcer le regroupement des sous-expressions:

instructor==b.getInstructor() && (days && tempDays) && (time && tempTime) 
           ^   ^^   ^

Cela dit, je vous conseille vivement d'aller à votre instructeur et en lui disant que il est fou. La surcharge de l'opérateur && (ou de l'opérateur ||) est presque toujours fausse car elle brise la sémantique normale de l'opérateur (surchargé, ces deux opérateurs cessent de court-circuiter).

+0

Excellent! Merci beaucoup pour votre réponse. Fonctionne parfaitement maintenant! Je n'arrive pas à croire que ce soit des problèmes de parenthèses, mais je n'aurais jamais pensé surcharger l'opérateur && comme vous l'avez dit. ;) Encore une fois, merci beaucoup! – Aurum

1
DaysOfWeek tempDays = b.getDays(); 
    TimeInterval tempTime = b.getTime(); 
    if(this->instructor==b.getInstructor() && 
     &this->days&&(&tempDays) && 
     &this->time&&(&tempTime)) 

Dans ce qui précède, vous utilisez logique et l'adresse de days par rapport à l'adresse de tempDays, vous devez être les objets, comparaient pas les adresses. Idem avec time et tempTime.