2017-10-15 14 views
1

La question que j'ai se rapporte au projet Time, que je vais publier ci-dessous pour donner un contexte. La plupart de ce que j'ai fait est correct, mais j'ai des problèmes avec les erreurs de cadrage quand il s'agit de la définition des opérateurs d'addition et de soustraction. Le compilateur ne peut pas trouver mes membres privés. (Les opérateurs sont pour si un utilisateur entre dans l'heure comme 25, il reboucle à un.) Le projet dans son ensemble crée des instances de méthodes déjà définies. De toute façon, la deuxième erreur, qui concerne les opérateurs eux-mêmes. Je reçois une erreurErreurs de portée et ne peut pas avoir un qualificatif cv?

Faire de la recherche me dit que cette erreur se produit de changer const, qui dans mon cas est temps lui-même. Je ne vois pas où j'ai fait ça. J'espère que je suis clair et peut clarifier si nécessaire. Le fichier .h provient de l'exercice lui-même, je ne peux pas changer cela autre que d'ajouter des membres privés.

#ifndef TIME_H_ 
#define TIME_H_ 

#include <iostream> 
#include <string> 
/*** Time class** The Time class contains time as 
hours:minutes:seconds:milliseconds (AM/PM).*/ 

class Time { 
public: 
/** * Constructor with zero values */ 
Time(); 

/** * Constructors with arguments */ 
Time(long long time); 
Time(int hours, int minutes, int seconds, int milli); 

/** * Deconstructor */ 
virtual ~Time(); 

/** * Return time as a long long value representing time in milliseconds */ 
long long asLong() const; 

/** * Provide a string in the format hours:minutes:seconds:milliseconds. * For example 1:45:30:56 PM */ 
std::string toString() const; 

/** * Output the time to an output stream as hours:minutes:seconds:milliseconds AM/PM */ 
friend std::ostream& operator <<(std::ostream&, const Time&); 

// Output a Time to an output stream 

/** * Declare ordering relationships */ 
friend bool operator <(const Time&, const Time&); 
friend bool operator >(const Time&, const Time&); 
friend bool operator ==(const Time &a, const Time &b); 

/** * Declare addition and subtraction */ 
Time operator +(const Time&) const; 
Time operator -(const Time&) const; 

private: 
int hours; 
int minutes; 
int seconds; 
int millis; 
}; 

#endif /* TIME_H_ */ 

puis la source elle-même.

#include "Time.h" 
#include <sstream> 
#include <string> 

using namespace std; 

// Defualt Constructor 
Time::Time() { 
    hours = 0; 
    minutes = 0; 
    seconds = 0; 
    millis = 0; 
} 

// Constructors with arguments 

Time::Time(long long timeValue) { 
    long long tempValue = timeValue; 
    millis = tempValue % 1000; 
    tempValue /= 1000; 
    seconds = tempValue % 60; 
    tempValue /= 60; 
    minutes = tempValue % 60; 
    tempValue /= 60; 
    hours = tempValue; 
} 

Time::Time(int hours, int minutes, int seconds, int millis) { 
    this->hours = hours; 
    this ->minutes = minutes; 
    this -> seconds = seconds; 
    this -> millis = millis; 

} 

// Destructor 
Time::~Time() { 

} 

// Return time in term of milliseconds. 

long long Time::asLong() const { 
    long long timeValue = (long long) hours; 
    timeValue = (timeValue * 60) + minutes; 
    timeValue = (timeValue * 60) + seconds; 
    timeValue = (timeValue * 1000) + millis; 
    return timeValue; 
} 

// Formatting 

std::string Time::toString() const { 
    ostringstream v1; 
    string ph; 

    if (hours <= 12) 
     ph = "am"; 
    else 
     ph = "pm"; 

    v1 << hours % 12 << ":" << minutes << ":" << seconds << ":" << millis << ph; 

    return v1.str(); 
} 

// Time to Output Stream 
ostream& operator <<(ostream& a, const Time& b) 
{ 
    return a << b.toString(); 
} 

// Ordering Relationships 
bool operator <(const Time&t1, const Time&t2) 
{ 
    return t1.asLong() < t2.asLong(); 
} 

bool operator >(const Time&t1, const Time&t2) 
    { 
    return t1.asLong() > t2.asLong(); 
} 
bool operator ==(const Time &a, const Time &b) 
{ 
    return a.asLong() == b.asLong(); 
} 

// Declare addition and Subtraction 
Time operator +(const Time&) const 
{ 
    int a,b,c,d; 
    a = t1.hours+t2.hours; 
    b = t1.minutes+t2.minutes; 
    c = t1.seconds+t2.seconds; 
    d = t1.millis+t2.millis; 
    if (d > 999) 
    { 
     c = c+1; 
     d = d - 1000; 
    } 
    if (c > 59) 
    { 
     b = b + 1; 
     c = c - 60; 
    } 
    if (b > 59) 
    { 
     a = a+1; 
     b = b-60; 
    } 
    if (a > 24) 
    { 
     a = a - 24; 
    } 
    return Time(a,b,c,d); 
} 
    Time operator -(const Time&) const 
    { 
     int a,b,c,d; 
     a = t1.hours-t2.hours; 
     b = t1.minutes-t2.minutes; 
     c = t1.seconds-t2.seconds; 
     d = t1.millis - t2.millis; 
     if (d < 0) 
     { 
      c = c -1; 
      d = d + 1000; 
     } 
     if (c < 0) 
     { 
      b = b - 1; 
      c = c + 60; 
     } 
     if (b < 0) 
     { 
      a = a + 1; 
      b = b - 60; 
     } 
     if (a < 24) 
     { 
     a = a + 24; 
     } 

     return Time(a,b,c,d); 
    } 

Répondre

0

Dans le cas, les fonctions non membres sont friend fonctions. Dans les fonctions non membres, il n'y a pas de paramètre this. ils n'ont pas besoin de qualificatif cv. Pourquoi ne pas les modifications:

friend bool operator <(const Time&, const Time&); 
friend bool operator >(const Time&, const Time&); 
friend bool operator ==(const Time &a, const Time &b); 

à

bool operator <(const Time &a); 
bool operator >(const Time &a); 
bool operator ==(const Time &a); 
+0

Je ne peux pas apporter des modifications au fichier .h. C'est ce qui m'a été donné pour le projet. Les seules modifications que je peux apporter au fichier .h consistent à ajouter des fonctions membres privées. –