2016-02-15 2 views
-6

Мы знаем, что увлекательный класс iostream является чем-то слишком мощным. он overloded оператора вставки "< <", чтобы принять много типов данных: ostream & оператора (ostream &, целые), ostream & оператора (ostream &, голец) ...C++ ostream << проблемы с перегрузкой

мы не можем instantiaate ostream: ostream Распечатать; потому что ostream потому, что его большинство CTORSs являются «защищенными» (не доступны извне).

единственным конструктором, который мы можем назвать, является ostream (streambuf *), который принимает указатель на другой объект класса (класс streambuf);

Я просто хотел портить с этим классом:

#include <ostream> 
using namespace std; 

int operator << (ostream& out, int* x) 
{ 
    out << "invoked!" << endl; 
    cout << *x; // works well! 
    cout << x; // normally works well and it prints the address that x points to but instead the program get in infinite loop or crushes! 
    return *x; 
} 

int main() 
{ 

    system("color 1f"); 

    int* pVal = new int(57); 

    cout << *pVal << endl; 

    int* pX = new int(7); 
    cout << *pX << endl; 

    cout << *pVal << ", " << *pX << endl; 

    //cout << pVal << endl; // this doesn't work because my operator returns 
    //int and not a reference to ostream. 
    // and it is equal to: 0 << endl; which generates the same error 
    cout << pVal; // this works 


// cout << endl << endl << endl; 
    return 0; 
} 

Я перегружен оператор вставки взять именующее выражение в качестве ссылки на объект ostream и указатель на INT, как RValue, я всплывающее сообщение внутри моя функция, чтобы убедиться, что она вызывается.

Обратите внимание, что я намеренно перегружен его вернуть INT значение, так что никто не может написать:

out << pInt << *pInt << endl; 

... но просто:

out << pInt; 

Моя проблема, как вы можете видеть в inline-комментарии выше, то, что cout << x нормально работает хорошо, вместо этого программа попадает в бесконечный цикл или подавляет!

return *x; 

Может кто-нибудь объяснить, почему я получаю сообщение об ошибке?

+0

Я написал эту проблему. пожалуйста, обратите внимание. cout << x; // нормально работает хорошо, и он печатает адрес, на который указывает x, но вместо этого программа попадает в бесконечный цикл или подавляет! return * x; – Raindrop7

ответ

1

Проблема вызвана тем, что если вы просто cout << x, она снова и снова будет перегружать вашу функцию. Он никогда не возвращается.

Вот решение (литая й к мочеиспусканию *)

int operator << (ostream& out, int* x) 
{ 
    out << "invoked!" << endl; 
    cout << *x; // works well! 
    cout << (void*)x; 
    return *x; 
} 
+0

ok спасибо, я получаю это – Raindrop7

+0

@KokuVanish, если вы благодарны за ответ, удалив весь вопрос, не является подходящим способом его показать. – Flexo