2016-04-26 3 views
-3

Я имею Class NumDays, как показано:Некорректное выход из перегруженного оператора << C++

Class NumDays 
{ 
    private: 
     double hours; 

    public: 
     NumDays() { hours = 0.0; }   //default constructor 
     NumDays(double hr) { hr = hours; } //initializing constructor 

    //Large class, nothing of importance, rest of class omitted 

    //overloading << operator 
    friend ostream &operator<<(ostream &out, NumDays a); 
} 

У меня есть NumDay.cpp, что включает в себя:

ostream &operator<<(ostream& out, NumDays a) 
{ 
    // takes amount of hours, computes to work days 

    int temp = a.hours/8; 

    //gives remainder of hours after full 8 hr workday. 

    double hrs = a.hours - (temp * 8); 

    //outputs 
    cout << fixed << setprecision(0); 
    out << (a.hours/8) << " Days, " << hrs << "hours"; 
    return out; 
} 

И я main.cpp включать:

int main() 
{ 
    // Initialized UDT object Declarations 
    NumDays hoursWorked_John;  // Instantiate with Default Constructor 
    NumDays hoursWorked_Sue(36.9); // Instantiate with Initializing Cons  
    NumDays hoursUsed_Sue(4.5);  // Instantiate with Initializing Cons 

    cout << "John's initial hours worked: " << hoursWorked_John << endl; 
    hoursWorked_John.addHours(56.78); 
    cout << " John's final hours worked: " << hoursWorked_John << endl; 

    cout << "Sue's initial hours worked: " << hoursWorked_Sue << endl; 

    //rest of main omitted for sake of size 

Когда я иду запускать этот небольшой раздел программы, это моя консоль:

Consle Output

Любые мысли о том, почему часы Сью так сказочно неправильно, но Джон правильно?

ответ

7
NumDays(double hr) { hr = hours; } //initializing constructor 

Упс. Здесь вы оставляете участника hours неинициализированным и изменяете временный аргумент hr. Вы, кажется, означает

NumDays(double hr) { hours = hr; } 

(или еще лучше :)

NumDays(double hr) : hours(hr) {} 
+0

Такая глупая ошибка. Спасибо, друг :) – Podo

+0

Был ли этот неподходящий вопрос спросить? Я был опущен 3 раза. Вопрос важен, форматирование является хорошим. Я не мог найти ошибку, поэтому я счел нужным привести ее сюда ... – Podo

2
NumDays(double hr) { hr = hours; } 

должен быть

NumDays(double hr) { hours = hr; } 
0

Проблема заключается в печати значения для мусора, потому что Ваш оператор << вызовов по умолчанию copy constructor из NumDays, который ничего не делает.

NumDays(const NumDays& other){ 
} 

Это означает, что вы не печатаете объекты, которые вы инициализированы раньше.
Решение:
Изменение оператора прототип следующим образом:

/* change NumDays a to const NumDays& a 
* a must not be modified by this operator (const). 
* a must be passed by reference (NumDays&) to avoid duplications (copy constructor) 
*/ 
ostream &operator<<(ostream& out,const NumDays & a) 
{ 
    int days = a.hours/8.f; 
    streamsize old_precision = out.precision(0); 
    ios_base::fmtflags old_flags = out.flags(); 
    out <<fixed<< days << " Days, " << (a.hours - days*8.f) << " hours"; 
    out.precision(old_precision);//restore old precision 
    out.flags(old_flags);//restore old format flags 
    return out; 
} 

Ваш оператор << прототип может работать только тогда, когда `copy constructor' перегружен так:

NumDays(const NumDays& other){ 
    hours = other.hours; 
} 

Я думаю, что вы не необходимо double точность float достаточно

Протестировано: g++ (Debian 4.9.2-10) 4.9.2

Смежные вопросы