2016-07-05 4 views
0

Для назначения класса мне нужно перегрузить операторы вставки и извлечения. У меня возникли проблемы с его печатью на консоли.C++ flush() не работает? Невозможно использовать endl

EDITED

К сожалению, это мой первый раз проводки. Я понимаю, что я не отправлял достаточно информации для вас, ребята, я в курсе, что должно быть необходимый код

driver.cpp

#include "mystring.h" 
#include <iostream> 

using namespace std; 

int main(){ 
    char c[6] = {'H', 'E', 'L', 'L', 'O'} 
    MyString m(c); 
    cout << m; 

    return 0; 
} 

mystring.h

class MyString 
{ 
    friend ostream& operator<<(ostream&, const MyString&); 

    public: 
    MyString(const char*); 
    ~MyString(const MyString&) 

    private: 
    char * str; //pointer to dynamic array of characters 
    int length; //Size of the string 

    }; 

mystring.cpp

#include "mystring.h" 
#include <iostream> 
#include <cstring> 

using namespace std; 

MyString::MyString(const char* passedIn){ 
    length = strlen(passedIn)-1; 
    str = new char[length+1]; 
    strcpy(str, passedIn); 
} 

MyString::~MyString(){ 
    if(str != NULL){ 
    delete [] str; 
    } 
} 

ostream& operator << (ostream& o, const MyString& m){ 
    for(int i = 0; i < strlen(m.str); i++){ 
    o << m.str[i]; 
    } 
    o.flush(); 
    return o; 
} 
+5

Я предлагаю либо опубликовать соответствующий код MyString, либо сделать [mcve], для которого не требуется 'MyString'. – juanchopanza

+4

Почувствовал это потому, что вам не хватает нулевого символа. –

+1

Кроме того, если 'm.str' - это строка в стиле C, этот код опустит свой последний символ. Несколько проблем с показанным кодом. –

ответ

1

использовать метод ostream::flush(). Как в:

ostream& operator << (ostream& o, const MyString& m){ 
    for(int i = 0; i < strlen(m.str)-1; i++){ 
     o << m.str[i]; 
    } 
    o.flush(); 
    return o; 
} 
+1

Было бы полезно добавить к вашему ответу будущим читателям, как это отличается от использования манипулятора ['std :: flush'] (http://en.cppreference.com/w/cpp/io/manip/flush) , как это делает ОП. Если такой разницы нет, возможно, это не проблема. – WhozCraig

+0

Я попытался использовать флеш как функцию-член тоже, те же результаты. Я обновил сообщение, чтобы попытаться включить более полезную информацию. –

1

Не пытайтесь скрыться изнутри вставки. Ни один из стандартных вставок не делает этого. Просто добавьте std::cout << '\n'; после вызова вашего вставки в main.

Проблема заключается в том, что std::cout является буферизированной линией. Это означает, что он сохраняет вставленные символы во внутреннем буфере, пока не увидит символ новой строки (или пока он явно не покраснеть). Вы увидите такое же поведение, если вы введете объект std::string, но не закончите линию.

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

  • Нет связанных вопросов^_^