
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.75] |
![]() |
|
![]() |
|
|
Зравствуйте!
Подскажите, пожалуйста, почему компилятор требует точку с запятой - ;? Прикреплённая картинка
|
![]() |
Сообщ.
#2
,
|
|
Хм. Серьёзно?
|
Сообщ.
#3
,
|
|
|
Это не компилятор требует. Это синтаксис языка того требует. Учите язык, а не методом тыка осваивайте работу компилятора.
|
Сообщ.
#4
,
|
|
|
Почему-то тема продублировалась...
![]() ![]() #include <conio.h> #include <iostream> #include "time.h" using namespace std; int main() { setlocale(0, "ru"); time t1(4500); _getch(); return 0; } Добавлено Цитата macomics @ Это синтаксис языка того требует. Ну и куда нужно поставить точку с запятой? [img]https://disk.yandex.ru/i/vqXnEcXI3YsQeA[/img] |
Сообщ.
#5
,
|
|
|
DDim1000, покажи содержимое своего файла time.h
|
![]() |
Сообщ.
#6
,
|
|
time – это функция:
![]() ![]() time_t time(time_t *timer); ![]() ![]() int a; int main() { a; 3; 12+34; } Добавлено P.S. Если копнуть в детали, то вот сравни: ![]() ![]() time_t t1(int); // прототип функции time_t t1(4500); // определение переменной t1 типа time_t, инициализируемой значением 4500 time_t t1 = 4500; // аналогично предыдущей строке time() + t1(4500); // вызов time() и сложение результата с вызовом t1 (при условии, что t1 некая функция с одним параметром; в C отсутствие прототипа функции не ошибка) time; t1(4500); // бессмысленное, но корректное выражение с последующим ещё одним выражением, содержащим вызов t1 (да-да, в C отсутствие прототипа функции не ошибка, в отличие от C++) /* итп */ |
Сообщ.
#7
,
|
|
|
Вот и я подумал про функцию, но решил уточнить. Ибо, если time.h брать как стандартный заголовок, его бы необходимо бы обрамлять угловыми скобками по фэн-шую, а не двойными кавычками. Но и в нем это объявление - функция. А если свой заголовочный файл - должно быть корректное объявление класса time.
|
Сообщ.
#8
,
|
|
|
Цитата Majestio @ time.h ![]() ![]() #pragma once #include <iostream> typedef unsigned int ui; class time { private: ui seconds; ui minutes; ui hours; public: time(void); time(ui); time(ui,ui,ui); time::operator+(const time& t) const; void operator<<(std::ostream& os) { os << hours << " : " << " : " << seconds; } ~time(void); }; time.cpp. ![]() ![]() #include "time.h" // time:: - указывает на то, что данный метод принадлежит к классу time, и за пределами этого класса данный метод не доступен. // Данный метод называется "конструктор по умолчанию", и он каждый раз вызывается при создании объекта класса. time::time(void) { hours = minutes = seconds = 0; } // time:: - указывает на то, что данный метод принадлежит к классу time, и за пределами этого класса данный метод не доступен // Данный метод называется "явный конструктор", и он каждый раз вызывается при создании объекта класса. time::time(ui sec) { hours = sec / (60 * 60); minutes = sec % (60 * 60) / 60; seconds = sec % (60 * 60) % 60; } time::time(ui h, ui m, ui s) { if (h > 24 || m > 60 || s > 60) { time::time(); return; } hours = h; minutes = m; seconds = s; } time time::operator+(const time& t) const { time result; result.seconds = (seconds+t.seconds)%60; result.minutes = (minutes + t.minutes(seconds + t.seconds) / 60)%60; result.hours = (hours + t.minutes(minutes + t.minutes) / 60); return result; } // time:: - указывает на то, что данный метод принадлежит к классу time, и за пределами этого класса данный метод не доступен // Данный метод называется "деструктор", и он вызывается когда удаляется бъекта класса. time::~time(void) { }; Source.cpp ![]() ![]() #include <conio.h> #include <iostream> #include "time.h" using namespace std; int main(int argc, char** argv) { setlocale(0, "ru"); time t1(4500); time t2(2, 35, 21); time t3; t3 << cout; _getch(); return 0; } |
Сообщ.
#9
,
|
|
|
Тэкссс.... А давай-ка присоедини весть свой проект в виде архива...
|
Сообщ.
#10
,
|
|
|
Цитата Majestio @ Тэкссс.... А давай-ка присоедини весть свой проект в виде архива... Вот, пожалуйста. Прекрепляю проект и видеоурок, по которому пишу код. https://disk.yandex.ru/d/C1_ktdLcDo0ulQ |
![]() |
Сообщ.
#11
,
|
|
В коде настолько много ошибок, что у меня просто нет времени. Сорри.
По теме. Это ничего не меняет в сказанном мною. Функция ![]() ![]() time_t time(time_t *timer); Добавлено P.S. ![]() ![]() #include <conio.h> #include <iostream> #include "time.h" using namespace std; int main(int argc, char** argv) { setlocale(0, "ru"); class time t1(4500); class time t2(2, 35, 21); class time t3; t3 << cout; _getch(); return 0; } |
Сообщ.
#12
,
|
|
|
Qraizer, я не поленился =)
DDim1000, лови подправленные файлы. Но как сказал Qraizer, ошибок over-многовато ![]() main.cpp ![]() ![]() #include <conio.h> #include <iostream> #include "time.h" using namespace std; int main([[maybe_unused]] int argc, [[maybe_unused]] char** argv) { setlocale(0, "ru"); time t1(4500); time t2(2, 35, 21); std::cout << t2; _getch(); return 0; } time.h ![]() ![]() #ifndef TIME_H #define TIME_H #include <iostream> typedef unsigned int ui; class time { private: ui seconds; ui minutes; ui hours; public: time(void); time(ui); time(ui, ui, ui); friend std::ostream& operator<<(std::ostream& os, const time& t); time operator+(const time& t) const; ~time(void); }; #endif // TIME_H time.cpp ![]() ![]() #include "time.h" time::time(void) { hours = minutes = seconds = 0; } time::time(ui sec) { hours = sec / (60 * 60); minutes = sec % (60 * 60) / 60; seconds = sec % (60 * 60) % 60; } time::time(ui h, ui m, ui s) : time() { if (h <= 24 && m <= 60 && s <= 60) { hours = h; minutes = m; seconds = s; } } time time::operator+(const time& t) const { time result; unsigned int totalSeconds = seconds + t.seconds; unsigned int carryMinutes = totalSeconds / 60; result.seconds = totalSeconds % 60; unsigned int totalMinutes = minutes + t.minutes + carryMinutes; unsigned int carryHours = totalMinutes / 60; result.minutes = totalMinutes % 60; result.hours = (hours + t.hours + carryHours) % 24; return result; } std::ostream& operator<<(std::ostream& os, const time& t) { os << t.hours << " : " << t.minutes << " : " << t.seconds; return os; } time::~time(void) {} Спойлер has been censored |
![]() |
Сообщ.
#13
,
|
|
DDim1000, краем одного глаза глянул урок. Гм. Я бы настоятельно предостерёг от таких уроков. Автор по ходу программировать по LLM учился. И дело даже не в C++.
Вот буквально сразу же. Цитата из Стандарта C: Цитата Назвав свой заголовок time.h, он уже грубо нарушил правила. Второе грубейшее нарушение:If a file with the same name as one of the above < and > delimited sequences, not provided as part of the implementation, is placed in any of the standard places for a source file to be included, the behavior is undefined. Цитата Нельзя было называть свою сущность как time, потому что это самый настоящий external identifier with the same name as a reserved external identifier. Больше комментировать не буду, у меня нет столько времени. ...If the program defines an external identifier with the same name as a reserved external identifier, even in a semantically equivalent form, the behavior is undefined. |
![]() |
Сообщ.
#14
,
|
|
Попробую по-быстрому отметить баги. За разъяснениями, если надо, спрашивай конкретно, конкретизирую.
![]() ![]() #pragma once // нестандартное решение, но поддерживаемое много где, т.ч. формально допустимое #include <iostream> // избыточно, достаточно ostream typedef unsigned int ui; class time // уже сказал; очень плохое имя класса { private: ui seconds; ui minutes; ui hours; public: time(void); // void в C++ избыточно, но не ошибка time(ui); // конструктор с одним параметром в большинстве случаев должен быть explicit time(ui,ui,ui); time::operator+(const time& t) const; // не скомпилится; тут :: явная ошибка, должен быть просто пробел; кроме того, иметь подобные операторы элементами классов, вообще говоря, не следует, // лучше их делать свободными функциями; для демонстрационного примера сойдёт, но в продакшне использовать не надо void operator<<(std::ostream& os) // аналогично; кроме того, тут грубо (и не очень тоже) нарушены правила интерфейса iostream; так же следует заметить, этот метод будет inline { // и вообще, тут достаточно объявления, и значит и вместо <ostream> было бы достаточно <iosfwd> os << hours << " : " << " : " << seconds; // пропущен вывод minutes } ~time(void); // деструктор для этого класса избыточен; }; Добавлено ![]() ![]() #include "time.h" // time:: - указывает на то, что данный метод принадлежит к классу time, и за пределами этого класса данный метод не доступен. // Данный метод называется "конструктор по умолчанию", и он каждый раз вызывается при создании объекта класса. time::time(void) { hours = minutes = seconds = 0; } // time:: - указывает на то, что данный метод принадлежит к классу time, и за пределами этого класса данный метод не доступен // Данный метод называется "явный конструктор", и он каждый раз вызывается при создании объекта класса. time::time(ui sec) { hours = sec / (60 * 60); minutes = sec % (60 * 60) / 60; seconds = sec % (60 * 60) % 60; } time::time(ui h, ui m, ui s) { if (h > 24 || m > 60 || s > 60) { time::time(); // это точно делает не то, что хотелось; тут создаётся новый временный объект и сразу же уничтожается, текущий же остаётся неинициализированным return; // если хотелось вызвать конструктор существующего объекта, то надо было this->time::time(), но это плохо } // в таких случаях делается отдельный, обычно приватный, метод и зовётся из конструкторов hours = h; minutes = m; seconds = s; } time time::operator+(const time& t) const { time result; result.seconds = (seconds+t.seconds)%60; result.minutes = (minutes + t.minutes(seconds + t.seconds) / 60)%60; // тут явно пропущены сложения result.hours = (hours + t.minutes(minutes + t.minutes) / 60); // надо бы + между minutes и ( return result; } // time:: - указывает на то, что данный метод принадлежит к классу time, и за пределами этого класса данный метод не доступен // Данный метод называется "деструктор", и он вызывается когда удаляется бъекта класса. time::~time(void) { }; Добавлено ![]() ![]() #include <conio.h> #include <iostream> #include "time.h" using namespace std; int main(int argc, char** argv) // аргументы main не используются и потому избыточны; Стандарт разрешает main без аргументов { // с ними же, но без использования, компиляторы могут ругаться предупреждениями setlocale(0, "ru"); // вызов абсолютно бесполезен, он ничего не меняет в системе; поменял бы вызов LC_ALL вместо 0, // но не для уже сконструированного (и других тоже) std::cout; для него нужен был бы std::cout.imbue(std::locale("ru")); time t1(4500); time t2(2, 35, 21); time t3; t3 << cout; _getch(); return 0; // для main() – и только для main() – return 0 необязателен, т.к. подразумевается } // но только 0! другие, если нужны, должны быть явными; это однако не ошибка, просто для информации |
Сообщ.
#15
,
|
|
|
Приведеденный мной код работает! Всего одно слово дописал. Угадайте, какое и куда?))
![]() ![]() time time::operator+(const time& t) const { time result; result.seconds = (seconds+t.seconds)%60; result.minutes = (minutes + t.minutes+(seconds + t.seconds) / 60)%60; result.hours = (hours + t.minutes+(minutes + t.minutes) / 60); return result; } |