Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
grayscale
1 / 1 / 1
Регистрация: 12.04.2013
Сообщений: 34
#1

Странное поведение cout после объявления объекта класса - C++

09.11.2013, 01:57. Просмотров 364. Ответов 11
Метки нет (Все метки)

C++
1
2
3
4
List words;
string strg;
сin >> strg;
сout << strg;
Ничего не выведет, пока в поток вывода не отправится endl или \n.
Если закомментировать первую строчку, вывод такой, как и положен быть.
C++
1
2
3
4
5
List::List()
{
    m_nCounter = 0;
    pHead = 0;
}
Среда - Qt Creator. У меня уже разрыв шаблона, помогите
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2013, 01:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Странное поведение cout после объявления объекта класса (C++):

Странное рекурсивное поведение объекта std::cout - C++
Пытался организовать очередь при помощи шаблона и наткнулся на &quot;странное&quot; поведение: // Организация очереди при помощи шаблона ...

Ошибка объявления объекта класса - C++
Добрый день, есть класс: #ifndef _SDLENTITY_H_ #define _SDLENTITY_H_ #include &lt;vector&gt; #include &quot;SDLAnimation.h&quot; #include...

wstring странное поведение после GetEnvironmentVariable - C++
Есть юникодовская строка. После GetEnvironmentVariable, строка становится L&quot;C:/windows&quot;(и это прекрасно показывает окно сообщения), но...

Вывод объекта класса созданного пользователем на консоль объектом cout - C++
Доброго времени суток ребят. Возникла задача вывести объект класса созданного пользователем на консоль с помощью объекта cout. Но так как я...

Ошибка компиляции после объявления класса - C++
Что не так в этом коде? Писал программку, не хочет запускаться. Упростил до минимума,все равно не работает! #include &lt;iostream&gt;; ...

Подскажите почему после первого cout программа не останавливается для ввода строки, а выводит второй cout - C++
Подскажите почему после первого cout программа не останавливается для ввода строки, а выводит второй cout. Это фрагмент со структурами: ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Эксперт CЭксперт С++
13223 / 7495 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 3
Завершенные тесты: 1
09.11.2013, 02:05 #2
а так?
C++
1
( std :: cout << strg ).flush ( ) ;
0
grayscale
1 / 1 / 1
Регистрация: 12.04.2013
Сообщений: 34
09.11.2013, 02:09  [ТС] #3
Цитата Сообщение от Croessmah Посмотреть сообщение
а так?
а так работает. Но выглядит костыльно.
Да и не в этом дело. Почему так происходит?
0
Croessmah
Эксперт CЭксперт С++
13223 / 7495 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 3
Завершенные тесты: 1
09.11.2013, 02:18 #4
Цитата Сообщение от grayscale Посмотреть сообщение
Почему так происходит?
Скорее всего из-за буферизации.
1
grayscale
1 / 1 / 1
Регистрация: 12.04.2013
Сообщений: 34
09.11.2013, 02:23  [ТС] #5
Цитата Сообщение от Croessmah Посмотреть сообщение
Скорее всего из-за буферизации.
а откуда она взялась, эта страшная Буферизация? издержки среды разработки?
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
09.11.2013, 02:29 #6
Цитата Сообщение от grayscale Посмотреть сообщение
Ничего не выведет, пока в поток вывода не отправится endl
endl выполняет flush после добавления перевода строки в поток.

Добавлено через 3 минуты
Цитата Сообщение от grayscale Посмотреть сообщение
а откуда она взялась, эта страшная Буферизация? издержки среды разработки?
Оптимизация.
1
grayscale
1 / 1 / 1
Регистрация: 12.04.2013
Сообщений: 34
09.11.2013, 02:31  [ТС] #7
Цитата Сообщение от gray_fox Посмотреть сообщение
Оптимизация.
простите, я не понял, что вы имеете в виду.
0
Croessmah
Эксперт CЭксперт С++
13223 / 7495 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 3
Завершенные тесты: 1
09.11.2013, 02:34 #8
Цитата Сообщение от grayscale Посмотреть сообщение
простите, я не понял, что вы имеете в виду.
Намного быстрее "вывести" 1 раз 100 символов, чем 100 раз по 1 символу.
1
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
09.11.2013, 02:42 #9
grayscale, грубо говоря, дешевле выводить на экран\записывать данные некоторыми порциями, а не по одному символу\байту. Для этого данные сначала накапливаются во временном хранилище (буфер), потом в устройство пишеться сразу весь буфер.

Добавлено через 54 секунды
Если надо, можно принудительно сбросить буфер с помощью flush.
1
grayscale
1 / 1 / 1
Регистрация: 12.04.2013
Сообщений: 34
09.11.2013, 02:50  [ТС] #10
Цитата Сообщение от gray_fox Посмотреть сообщение
Для этого данные сначала накапливаются во временном хранилище (буфер), потом в устройство пишеться сразу весь буфер.
Но если не создавать объект класса, все работает нормально. И вообще у меня никогда с этим проблем не было.
Дело в потребляемой памяти что ли?
А кто решает, что в данном конкретно случае следует буфферизовать данные? ОС, или это происходит на этапе компиляции?
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
09.11.2013, 03:11 #11
Цитата Сообщение от grayscale Посмотреть сообщение
А кто решает, что в данном конкретно случае следует буфферизовать данные? ОС, или это происходит на этапе компиляции?
Зависит от устройства. stderr например (с ним связан std::cerr) не буферизован.

Добавлено через 18 минут
Ну т.е. компиляция тут вообще не причём. Просто для многих устройств реализована буферизация: в стандартной библиотеке, своя в ОС, там много может быть уровней.
1
grayscale
1 / 1 / 1
Регистрация: 12.04.2013
Сообщений: 34
09.11.2013, 03:24  [ТС] #12
gray_fox, разобрался, спасибо

Добавлено через 5 минут
cpp.com.ru/bogatyrev_c_unix/gl_4_3.html
оставлю это здесь для потомков
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2013, 03:24
Привет! Вот еще темы с ответами:

Странное поведение new - C++
Объясните почему оператор new выделяет неверное количество памяти? # include &lt;iostream&gt; using namespace std; char* interpitator( int...

Странное поведение - C++
Здравствуйте еще раз :) Теперь возникла другая непонятка. Есть класс StringParser, объекты которого умеют разбивать строку на подстроки,...

Друзья, подскажите, говорят, что можно поля класса инициализировать в момент объявления класса. Как это сделать? - C++
Скажу сразу, а то сейчас начнется, что я прекрасно понимаю, что поля класса при объявлении инициализировать нельзя. Можно конструктором при...

Странное поведение указателей - C++
Здравствуйте, может кто-нибудь объяснить столь странное поведение указателя. Вот код. int main() { const int Width = 3; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.11.2013, 03:24
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru