2013-02-24 3 views
1

Я пытаюсь перегрузить оператор потока <<, но он все еще просто печатает адрес объекта вместо информации об объекте, как у меня в определении функции перегрузки. Вот мой код, потратил довольно много времени на то, чтобы каждый пример, который я мог найти в Интернете, но ничего не работает. Пожалуйста, помогите смягчить некоторые из моих стрессов! Благодарю.Перегрузка << оператор не работает; все еще печатать адрес объекта

Interval.h:

#ifndef INTERVAL_H 
#define INTERVAL_H 
#include <string> 
#include <iostream> 
#include <assert.h> 

using namespace std; 

class Interval { 
    public: 
     long start; 
     long end; 

     // Constructor 
     Interval(long, long); 

     // Deconstructor 
     // Virtual to make sure that it calls the correct destructor 
     virtual ~Interval(); 

     bool operator==(const Interval &other) const; 
     bool operator!=(const Interval &other) const; 
     bool operator<(const Interval &other) const; 
     bool operator<=(const Interval &other) const; 
     bool operator>(const Interval &other) const; 
     bool operator>=(const Interval &other) const; 
     friend ostream& operator<<(ostream& os, const Interval &i); 

}; 
#endif 

Interval.cpp:

#include "Interval.h" 
#include <iostream> 
#include <string> 

using namespace std; 

Interval::Interval(long a, long b){ 
    // Assert that start is less than the end 
    assert(a < b); 
    start = a; 
    end = b; 
} 

// Deconstructor 
Interval::~Interval(){ 
} 

bool Interval::operator==(const Interval &other) const{ 
    // Return true if both start and end are equal to other's 
    if(start == other.start && end == other.end){ 
     return true; 
    }else{ 
     return false; 
    } 
} 

bool Interval::operator!=(const Interval &other) const{ 
    // Return true(not equal) if either the start or end are different 
    if(start != other.start || end != other.end){ 
     return true; 
    }else{ 
     return false; 
    } 
} 
bool Interval::operator<=(const Interval &other) const{ 
    // Return true if the start is less than or equal other's start 
    if(start <= other.start){ 
     return true; 
    } 
} 

bool Interval::operator>(const Interval &other) const{ 
    // Return true if the end is greater than other's end 
    if(end > other.end){ 
     return true; 
    } 
} 

bool Interval::operator>=(const Interval &other) const{ 
    // Return true if the end is greater than or equal to other's end 
    if(end >= other.end){ 
     return true; 
    } 
} 


bool Interval::operator<(const Interval &other) const{ 
    // Return true if the start is less than other's 
    if(start < other.start){ 
     return true; 
    } 
} 

ostream& operator<<(ostream& os, const Interval &i){ 

    os << "Interval[" << i.start << ", " << i.end << "]" << endl; 
    return os; 
} 

int main(void){ 
    Interval *test = new Interval(10,1000); 
    cout << test << endl; 
    cout << "test" << endl; 
} 

ответ

5

Interval* является указателем. Вы просто выводите адрес.

Try разыменования указателя:

cout << *test << endl; 

Или попробуйте следующее:

Interval test(10, 1000); // not a pointer. 
cout << test << endl; 
+0

Я серьезно не могу поверить, что я этого не замечал. Спасибо большое! – midma101

1
Interval *test = new Interval(10,1000); 

Синтаксис в C++ для создания объекта на стеке

Interval test(10,1000); 

Дон Не используйте указатели, если у вас нет хорошего результата чтобы сделать это.