Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Перегрузка конструкторов (C++)  (Прочитано 1693 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Kernel ops

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1388
    • Просмотр профиля
Изучаю c++, дошел до перегрузки конструкторов объектов. В этой теме все понятно, с перегрузкой вопросов нет. Вопрос вот в чем:
/* Перегрузка конструкторов */

using namespace std;

#include <iostream>
#include <ctime>
#include <cstdlib>

class timer {
int seconds;
public:
timer(char *t) {seconds=atoi(t);}
timer(int t) {seconds=t;}
timer(int min, int sec) {seconds=min*60+sec;}
void run();
};

void timer::run() {
cout << "Таймер запущен!";

int timeStart=time('\0');

do {} while(time('\0')<seconds+timeStart);

cout << "Таймер завершен!";
}

int main() {

timer runner(5);

runner.run();

return 0;
}

при этом, сначала проходит 5 секунд, и только потом друг за другом мгновенно появляются надписи "Таймер запущен!Таймер завершен!". Цикл менял на for и while - не помогло, менял названия переменных (может зарезервированные использую) - не помогло выносил cout в main - не помогло. В чем может быть дело?
root@shkiper:~$mount -t btrfs /dev/head1 /mnt && ls /mnt | grep brain | xargs -i sh /mnt/{}

Оффлайн SergeyIT

  • Зануда.
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5731
  • Все по палатам!
    • Просмотр профиля
Re: Перегрузка конструкторов (C++)
« Ответ #1 : 19 Мая 2013, 15:31:51 »
После
cout << "Таймер запущен!";
добавь
cout.flush();
Извините, я все еще учусь

Оффлайн aSmile

  • Активист
  • *
  • Сообщений: 755
    • Просмотр профиля
Re: Перегрузка конструкторов (C++)
« Ответ #2 : 19 Мая 2013, 15:33:26 »
Можно добавить flush(), как сказали ранее, а можно дописать каждому cout в конце  << endl. Так и читаться лучше будет.
Код: (c++) [Выделить]
cout << "Таймер запущен!" << endl;

Про std::endl
« Последнее редактирование: 19 Мая 2013, 15:35:24 от aSmile »

Оффлайн Kernel ops

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1388
    • Просмотр профиля
Re: Перегрузка конструкторов (C++)
« Ответ #3 : 19 Мая 2013, 15:55:30 »
да, оба варианта работают, даже такой:
cout << "Таймер запущен!\n";как я понял, flush/endl очищают поток (stream) в stdout?
root@shkiper:~$mount -t btrfs /dev/head1 /mnt && ls /mnt | grep brain | xargs -i sh /mnt/{}

Lifewalker

  • Гость
Re: Перегрузка конструкторов (C++)
« Ответ #4 : 19 Мая 2013, 17:11:59 »
да, оба варианта работают, даже такой:
cout << "Таймер запущен!\n";
Совершенно не по Си++сному. Самый художественно-выдержанный вариант безусловно cout << "Sometext" << endl;

Оффлайн Kernel ops

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1388
    • Просмотр профиля
Re: Перегрузка конструкторов (C++)
« Ответ #5 : 19 Мая 2013, 17:14:39 »
Lifewalker,
только из-за его наглядности
root@shkiper:~$mount -t btrfs /dev/head1 /mnt && ls /mnt | grep brain | xargs -i sh /mnt/{}

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Перегрузка конструкторов (C++)
« Ответ #6 : 20 Мая 2013, 05:21:48 »
time('\0')Теперь осталось только выяснить какое больное сознание родило этот шедевр

Ну хрен с ними с любителями писать '\0' вместо 0 там где требуется просто нулевой символ.
Ну хрен с ними с любителями писать 0 там где про руководству требуется писать NULL
Ну я понимаю что в итоге в функцию передастся нулевой указатель. Но это же еще понимать надо. А читать этот бред невозможно.


(Нажмите, чтобы показать/скрыть)

Оффлайн quiet_readonly

  • Участник
  • *
  • Сообщений: 133
    • Просмотр профиля
Re: Перегрузка конструкторов (C++)
« Ответ #7 : 20 Мая 2013, 12:18:45 »
Есть ещё одна претензия к качеству кода, кроме передачи "\0": при передаче в конструктор переменной типа const char * будет вызван конструктор timer(int), а не timer(char *). Именно поэтому лучше вообще не баловаться перегрузкой конструкторов без необходимости, а если пришлось - надо проверить, не возникнет ли казусов из-за преобразования типов.

Оффлайн Kernel ops

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1388
    • Просмотр профиля
Re: Перегрузка конструкторов (C++)
« Ответ #8 : 20 Мая 2013, 13:39:15 »
quiet_readonly,
я перевел на clock():
/* Перегрузка конструкторов */

using namespace std;

#include <iostream>
#include <ctime>
#include <cstdlib>

class timer {
int seconds;
public:
timer(char *t) {seconds=atoi(t); cout << "CHK\n";}
timer(int t) {seconds=t;}
timer(int min, int sec) {seconds=min*60+sec;}
void run();
};

void timer::run() {
clock_t start=clock();

for (;start+seconds*CLOCKS_PER_SEC>clock(););
}

int main() {
timer runner("7"), checker(3);

cout << "Приготовьтесь!\n";
checker.run();

cout << "Таймер запущен!\n";
runner.run();
cout << "Таймер завершен!";
return 0;
}
и при отправке строки отправляется ссылка на неё. но вот если поставить одинарные кавычки - отправляемой переменной присваивается номер символьной константы и она отправляется в int конструктор. обошлось без NULL
не забывайте, что это только упражнение на перегрузку, естественно, куда попало ее никто пихать не будет
root@shkiper:~$mount -t btrfs /dev/head1 /mnt && ls /mnt | grep brain | xargs -i sh /mnt/{}

Lifewalker

  • Гость
Re: Перегрузка конструкторов (C++)
« Ответ #9 : 21 Мая 2013, 09:34:47 »
Именно поэтому лучше вообще не баловаться перегрузкой конструкторов без необходимости,
(Нажмите, чтобы показать/скрыть)

 

Страница сгенерирована за 0.066 секунд. Запросов: 25.