Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Вопросник новичка |
Автор: Rickert 11.10.2007, 05:26 |
Я предлогаю закрепить эту тему где-нибудь на видно месте и чтобы люди, которые только начали изучать язык и не могут пока осилить "hello world" или не понимают почему теперь iostream.h указывается без *.h - отписывали свои вопросы тут. Согласитесь - большая часть таких людей не пользуется поиском, и создаёт темы с элементарными вопросами и начинается перепалка с модераторами / ругань / баны / обиды / сопли намотанные на кулак и всё такое прочее ![]() А тут без злости так сказать будем отвечать на их вопросы ![]() |
Автор: tdebugger 11.10.2007, 08:29 |
У меня такой вопрос - почему теперь iostream.h указывается без *.h, я серьезно, раньше я как-то не обращал на это внимания, а раз тут такое дело, не грех и спросить.... |
Автор: DjoNIK 11.10.2007, 08:32 |
По стандарту *.h - Си-шный стиль, в то время как в С++ - либо *.hpp, либо вообще без расширения. |
Автор: MAKCim 11.10.2007, 08:35 |
DjoNIK, а разве стандартом оговорены расширения файлов? ![]() |
Автор: DjoNIK 11.10.2007, 08:46 |
MAKCim, не по стандарту компилятора, конечно, это в принципе невозможно ![]() По одному из принятых стандартов (по-крайней мере я так читал у авторитетного источника) |
Автор: Rickert 11.10.2007, 08:56 |
Вроде по последнему стандарту принято, что заголовочные файлы не должны иметь расширения. Правда чем это обусловлено - не ясно. |
Автор: FiMa1 11.10.2007, 09:25 | ||||||||||||
Copy/Paste (Шилдт Г. Самоучитель С++): Новые заголовки в программах на C++ Как вам должно быть известно из опыта программирования на С, при использовании библиотечной функции в программу необходимо включить заголовочный файл. Это делается с помощью инструкции #include. Например, при написании программ на языке С заголовочным файлом для функций ввода/вывода является файл stdio.h, который включается в программу с помощью следующей инструкции:
Здесь stdio.h — это имя файла, который используется функциями ввода/вывода, и предыдущая инструкция заставляет компилятор включить указанный файл в вашу программу. В первые несколько лет после появления C++ в нем использовался тот же стиль оформления заголовков, что и в С. Для совместимости с прежними программами в языке Standard C++ этот стиль по-прежнему поддерживается. Тем не менее при работе с библиотекой Standard C++ в соответствии с новым стилем вместо имен заголовочных файлов указываются стандартные идентификаторы, по которым компилятор находит требуемые файлы. Новые заголовки C++ являются абстракциями, гарантирующими объявление соответствующих прототипов и определений библиотеки языка Standard C++. Поскольку новые заголовки не являются именами файлов, для них не нужно указывать расширение .h, а только имя заголовка в угловых скобках. Ниже представлены несколько заголовков, поддерживаемых в языке Standard C++:
Такие заголовки по-прежнему включаются в программу с помощью инструкции #include. Единственным отличием является то, что новые заголовки совершенно не обязательно являются именами файлов. Поскольку С++ содержит всю библиотеку функций С, по-прежнему поддерживается стандартный стиль оформления заголовочных файлов библиотеки С. Таким образом, такие заголовочные файлы, как stdio.h и ctype.h все еще доступны. Однако Standard C++ также определяет заголовки нового стиля, которые можно указывать вместо этих заголовочных файлов. В соответствии с версией C++ к стандартным заголовкам С просто добавляется префикс с и удаляется расширение .h. Например, заголовок math.h заменяется новым заголовком C++ <cmath>, а заголовок string.h — заголовком <cstring>. Хотя в настоящее время при работе с функциями библиотеки С допускается включать в программы заголовочные файлы в соответствии со стилем С, такой подход не одобряется стандартом языка Standard C++. (То есть, он не рекомендуется.) По этой причине во всех имеющихся в книге инструкциях #include используется новый стиль написания заголовков программ. Если ваш компилятор для функций библиотеки С не поддерживает заголовки нового стиля, просто замените их заголовками в стиле С. Поскольку заголовки нового стиля появились в C++ совсем недавно, во многих и многих прежних программах вы их не найдете. В этих программах в соответствии со стилем С в заголовках указаны имена файлов. Ниже представлен традиционный способ включения в программу заголовка для функций ввода/вывода:
Эта инструкция заставляет компилятор включить в программу заголовочный файл iostream.h. Как правило, в заголовках прежнего стиля вместе с расширением .h используется то же имя, что и в соответствующих им новых заголовках. Как уже отмечалось, все компиляторы C++ поддерживают заголовки старого стиля. Тем не менее такие заголовки объявлены устаревшими и не рекомендуются. Именно поэтому в книге вы их больше не встретите. ! Несмотря на повсеместное распространение в программах заголовков старого стиля, они считаются устаревшими. Библиотека <iostream.h>не является частью стандарта языка. С другой стороны библиотека <iostream> входит в стандарт. Библиотека <iostream> реализована в виде объектно-ориентированной иерархии классов, поддерживает как основные так и расширенные (unicode) символы. С другой стороны <iostream.h> ограничена исключительно символами char (символы ASCII). Кроме того, целесообразно использовать <iostream>, если, разумеется, ваш компилятор поддерживает это, т.к. все компоненты <iostream> находятся в пространстве имен (namespace) std, в то время, как компоненты <iostream.h> располагаются в глобальном пространстве. Есть три основных механизма использования библиотеки <iostream>:
|
Автор: FiMa1 11.10.2007, 10:23 |
Какой компилятор выбрать? http://forum.vingrad.ru/forum/topic-49632.html Какую книгу выбрать? http://forum.vingrad.ru/books/topic-48036/view-all.html Что такое: STL, MFC, ATL, API, WinAPI, .Net, VCL? http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%B0%D1%8F_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B0_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2 http://ru.wikipedia.org/wiki/MFC http://en.wikipedia.org/wiki/Active_Template_Library http://ru.wikipedia.org/wiki/API http://ru.wikipedia.org/wiki/WinAPI http://ru.wikipedia.org/wiki/.Net http://ru.wikipedia.org/wiki/VCL Итог: да и воздастся ищущему... ДРУЗЬЯ, ПРЕДЛАГАЮ ИЗБЕГАТЬ ВОСТОРЖЕННЫХ И БЛАГОДАРСТВЕННЫХ РЕПЛИК В ДАННОМ ТРЕДЕ, ДАБЫ НЕ ПЕРЕГРУЖАТЬ ЕГО ЛИШНЕЙ ИНФОРМАЦИЕЙ, ЕСЛИ ТРЕД ДЕЙСТВИТЕЛЬНО РЕШЕНО ЗАКРЕПИТЬ! СПАСИБО И БЕЗ ОБИД ![]() |
Автор: tdebugger 11.10.2007, 11:36 |
Спасибо за бурную реакцию, однако появились вопросы по некоторым нюансам, как получу доступ к IDE, проверю, уточню и выскажу... |
Автор: mrbrooks 11.10.2007, 12:05 |
to FiMa1 будте справедливы киньте ссылку еще на VCL! |
Автор: chelser 11.10.2007, 12:39 |
ценная информация спасибо |
Автор: FiMa1 11.10.2007, 15:18 | ||||||||||||||||||
В чем отличие ссылки от указателя? Как использовать ссылки? В C++ есть элемент, родственный указателю — это ссылка (reference). Ссылка является скрытым указателем и во всех случаях, и для любых целей ее можно употреблять просто как еще одно имя переменной. Ссылку допустимо использовать тремя способами:
Наиболее распостраненное применение ссылки — передача ее в качестве параметра функции. Что бы понять, что такое параметр-ссылка и как это работает, рассмотрим программу, в которой параметром является указатель, а не ссылка:
Здесь функция foo() загружает целое значение 100 по адресу, который обозначен указателем p. В данной программе функция foo() вызывается из функции main() с адресом переменной i, по которому она располагается в памяти. Таким образом, после выполнения функции foo() переменная i будет содержать число 100. В этой программе показано, как использовать указатель для реализации механизма передачи параметра посредством вызова по ссылке (call by reference). В программах С такой механизм является единственным спосо бом добиться вызова функции по ссылке. Запомните в языке Си ссылок нет! Однако в C++ с помощью параметра-ссылки можно полностью автоматизировать весь процесс. Чтобы узнать, как это сделать, изменим предыдущую программу. В ее новой версии используется параметр-ссылка:
Проанализируйте эту программу! Во-первых, для объявления параметра-ссылки перед именем переменной ставится знак амперсанда (&). Таким образом, переменная r объявляется параметром функции foo(). Теперь, поскольку переменная r является ссылкой, больше не нужно и даже неверно указывать оператор ‘*’. Вместо него всякий раз, когда переменная п упоминается внутри функции f(), она автоматически трактуется как указатель на аргумент, используемый при вызове функции f(). Это значит, что инструкция
фактически помещает число 100 в переменную, используемую при вызове функции foo(), каковой в данном случае является переменная i. Далее, при вызове функции f() перед аргументом не нужно ставить знак &. Вместо этого, поскольку функция f() объявлена как получающая параметр-ссылку, ей автоматически передается адрес аргумента. Теперь важно запомнить следующее: значение адреса, на который указывает ссылка, вы изменить не можете (в этом поведение ссылок схоже с поведением константных указателей). Например, если в программе, где используется параметр-ссылка поместить в тело функции foo инструкцию:
Вместо инкрементирования адреса, как это было бы с использованием указателей эта инструкция инструкция инкрементирует значение переменной (в данном случае это переменная i). Кроме того, ссылка должна быть инициализирована в месте ее объявления, так если вы напишите где-то в программе, к примеру:
то непременно получите ошибку вида “references must be initialized” (в этом можно найти еще одно сходство ссылок с константными указателями). Параметры-ссылки имеют несколько преимуществ по сравнению с аналогичными (более или менее) альтернативными параметрами-указателями. Во-первых, с практической точки зрения нет необходимости получать и передавать в функцию адрес аргумента. При использовании параметра ссылки адрес передается автоматически. Во-вторых, по мнению многих программистов, параметры-ссылки предлагают более понятный и элегантный интерфейс, чем механизм указателей. В-третьих, как вы узнаете потом, при передаче объекта функции через ссылку копия объекта не создается. Это уменьшает вероятность ошибок, связанных с построением копии аргумента и вызовом ее деструктора. ВОЗВРАЩЕНИЕ ПАРАМЕТРОВ ИЗ ФУНКЦИЙ ПОСРЕДСТВОМ ССЫЛОК Фактически ничего особенного здесь нет, реализуется это также как и в случае с получением параметров посредством ссылок. Для начала рассмотрим пример с использованием указателей для возврата значений из функций:
Но функции могут возвращать и ссылки, однако здесь надо быть осторожным! Если возвращение ссылки переменной объявлено в вызываемой функции, переменная должна быть объявлена внутри этой функции как static. В противном случае ссылка адресуется автоматической переменной, которая после завершения функции уничтожается; в таком случае говорят, что переменная «не определена» и поведение программы непредсказуемо. Так для следующего примера
вы получите следующее предупреждение: “ returning address of local variable or temporary”. Да, результат выполнения такой программы чреват печальными последствиями, если к моменту использования значения переменной var, располагающееся по адресу возвращаемому функцией foo, значение будет перезаписано чем-либо другим. Таким образом вы должны объявить var так
Обратите внимание, что для возврата адреса переменной var из функции также не нужно использовать оператора взятия адреса ‘&’, т.к. функция изначально была объявлена как возвращающая ссылку на переменную целого типа. Соответственно и в main оператора разыменования ‘*’ писать не нужно. НЕЗАВИСИМЫЕ ССЫЛКИ Хотя они обычно и не используются, вы можете создавать независимые ссылки (independent reference). Независимая ссылка — это ссылка, которая во всех случаях является просто другим именем переменной. Поскольку ссылкам нельзя присваивать новые значения, независимая ссылка должна быть инициализирована при ее объявлении. ! Большинство программистов чувствует ненужность независимых ссылок, они добавляют неразберихи в программу. Как правило, их следует избегать. Пример программы с независимой ссылкой:
В этой программе независимая ссылка ref служит другим именем переменной х. С практической точки зрения ref и х идентичны. В завершении подведем некоторые ограничения, которые распостраняются на ссылки:
|
Автор: FiMa1 11.10.2007, 15:45 | ||||
Первое что пришло в голову... Ну и так, если все ж останется: Чем отличается константный указатель от константного указателя на константу? Константный указатель- для такого указателя невозможно изменить адрес на который он указывает. Константный указатель на константу - для такого указателя невозможно изменить ни адрес на который он указывает, ни значение, которое находится по данному адресу в памяти. Для примера просмотрите приведенный ниже код:
|
Автор: Rickert 11.10.2007, 17:06 |
zkv, понимаешь, не в обиду будет сказано дзайнеру и админам, но раздел FAQ - незаметен. Если бы ссылка на него висела в разделе "C/C++ общие вопросы" - то народ бы юзал. имхо. |
Автор: Fazil6 11.10.2007, 18:05 | ||
FiMa1, ты серьёзно? ты написал много, но честно говоря ценность этого весьма сомнительна... Тема отличия указателей и ссылок не раскрыта. Если уж пишешь о передаче ссылок в функции, то где тема о константных ссылках и вообще зачем использовать передачу по ссылке и константной ссылке, так что опять незачет. Не раскрыта тема "Зачем возвращать ссылки из функций". После раскрытия ее становится ясно, что это применяется в конкретных случаяхи и в общем случае возвращать ссылки из функций не подходящее решение. Если уж советовать возвращать ссылку на static переменную, то нужно следом писать статью о том насколько это некрасиво и чем черевато.
Не помню кто сказал |
Автор: archimed7592 12.10.2007, 08:29 | ||||
Давайте, давайте, скопипастити сюда Страуструпа, Шилдта и прочих писателей для новичков... Желательно в полном объёме ![]() Думаю, 90% всех подобных вопросов освещены в http://www.parashift.com/c++-faq-lite/index.html, правда он на английском, что новичка не всегда устраивает... Да с новичками наверное всегда проблемы будут... Ну не знают они обычаев форума, не обучены нэтикету.
Твои сновидения - это авторитетный источник ![]()
По последнему(и предпоследнему ![]() Обусловлено, думаю, тем же, что и зарезервированные идентификаторы - отсутствием коллизий имён файлов. |
Автор: tdebugger 12.10.2007, 08:44 | ||
так вот
насчет абстракций - файл iostream таковым не является, потому что он СУЩЕСТВУЕТ ! Короче, мои идеи по этому поводу - "стандартные идентификаторы" будут реализованы в будущем, а сейчас для совместимости используются имена реальных файлов... |
Автор: archimed7592 12.10.2007, 08:56 | ||
Имеет право не существовать. Это интимное дело конкретной реализации(компилятора) - как и что организовать, чтобы её(реализации) поведение полностью соответствовало Стандарту. Добавлено через 1 минуту и 16 секунд А зачем ![]() |
Автор: FiMa1 12.10.2007, 11:05 | ||||
Отличия указателей от ссылок
Когда следует возвращать ссылки и делать их константными? Внимательно читаем здесь http://mech.math.msu.su/~vvb/2course/Lect01.html#Const Когда использовать передачу константных ссылок? Объект, как правило, передается по константной ссылке для предотвращения его изменения в процессе передачи и обработки получателем. Кроме того такой подход позволяет избежать копирования всех полей объекта класса, как это было бы с передачей его по значению и, следовательно, избежать лишних затрат. Аналогичную функциональность можно реализовать и с применением константных указателей на константы, но это потребует наличия специального синтаксиса, присущего для указателей. В общем примерно в том духе. А вообще ДА И ВОЗДАСТСЯ ИЩУЩЕМУ! |
Автор: archimed7592 12.10.2007, 11:11 |
FiMa1, ты сам эти мануалы пишешь ![]() |
Автор: Fazil6 12.10.2007, 11:26 | ||
ссылка намного сильнее отличается от указателя чем тебе кажется http://forum.sources.ru/index.php?showtopic=146010&hl=%D1%D1%DB%CB%CA%C0,and,%D3%CA%C0%C7%C0%D2%C5%CB%DC,and,%D0%C0%C7%CD%C8%D6%C0 |
Автор: FiMa1 12.10.2007, 11:43 | ||||
И да и нет.. не люблю/некогда изобретать велосипед, если что-то есть в инете на тему, то анализ найденного, выборка, copy, небольшое редактирование, дополнение и paste. Я ведь к чему и подвожу ДА И ВОЗДАСТСЯ ИЩУЩЕМУ ![]() Новички, вы просто не льстите себе, в 99,9% случаев вы не нашли новой закономерности/ошибки компилятора.... и, наверняка, вопрос ваш не оригинален, уже не раз поднимался и был решен. 1. Обязательно прочитайте следующее: http://forum.vingrad.ru/forum/topic-48015.html http://www.citforum.ru/howto/smart-questions-ru.shtml 2. Обязательно пробуйте искать существующее решение вашего вопроса: http://forum.vingrad.ru/act-Search/f-92.html Поисковые системы 3. Никогда не задавайте следующих вопросов: - Что лучше С или С++ и с чего начать? - Где взять книги по С/С++ и какие? - Я новичок в программировании, дайте мне задание... Ответы для себя и дискуссии на эти вопросы вы сможете найти в любом месте Интернета.
Fazil6, большое спасибо! Обязательно прочту. |
Автор: archimed7592 12.10.2007, 12:38 | ||
Ну, во-первых, если копипастишь, то обязательна ссылка на оригинал(ибо не воздастся плагиатчику...), а, во-вторых, из моего опыта общения с тобой мне показалось, что тебе рановато мануалы писать... |
Автор: FiMa1 12.10.2007, 12:53 | ||||
Ссылки всегда присутствуют...
Ok, молчу ![]() |
Автор: mrbrooks 12.10.2007, 13:49 | ||||
Э нее батенька вы не правы. Пускай пишет. как никак повторение - мать учения. Если человек хочет писать - пускай пишет. Сто пудово кому то поможет. Так что пиши FiMa1 - если будет время - почитаем - все равно порою на работе делать не фиг ![]() |
Автор: DreLaZ 12.10.2007, 14:22 |
Я пользуюсь Borland C++ 4.5 (1991-1994) в коде программы надо писать <iostream.h> и std при написании проги не надо. В книге написано что это старинный компилятор, но где достать новый компиллятор и есть ли большое отличие? |
Автор: FiMa1 12.10.2007, 14:34 | ||
DreLaZ, молодец! Твой вопрос действительно оригинален и не поднимался... по крайней мере в данном треде он уже не поднимался целых 17 постов... http://forum.vingrad.ru/forum/topic-49632.html ЗЫЖ: для кого пишем ![]() |
Автор: Dronchik 12.10.2007, 14:35 |
http://www.microsoft.com/downloads/details.aspx?FamilyId=B98A61BA-99B0-40B7-AB6E-5386A2B94217&displaylang=en Добавлено через 1 минуту и 27 секунд http://msdn2.microsoft.com/en-us/visualc/aa336402.aspx |
Автор: DreLaZ 12.10.2007, 14:53 |
http://forum.vingrad.ru/forum/topic-49632.html Эту тему я уже читал. Все подряд качать не в сосотоянии. Каким компиллятором посоветуете мне пользоваться (чтоб было без .h)? |
Автор: zkv 12.10.2007, 15:21 |
Microsoft Visual Studio 2005 Express Edition |
Автор: FiMa1 12.10.2007, 15:38 |
Да, вот еще что, не удержался что бы не добавить, дорогие новички, пожалуйста не начинайте учиться программировать с VCL приложений в Borland C++ Builder, т.е. приложений, использующих визуальные компоненты. Начинайте учиться программировать с консольных приложений. Для BCB 6.0: File->New->Other, выбираем Console Wizard, жмем Ok, в следующем окне выбираем язык исходного кода создаваемой программы (С/С++) и снова Ok. |
Автор: DreLaZ 12.10.2007, 15:39 | ||||||
Кстати, он у меня был. Он также не хочет компилить
выдает ошибку
|
Автор: archimed7592 12.10.2007, 15:49 |
Ну это уже что-то из разряда фантастики ![]() Есть два варианта: 1. Ты ни разу не написал этот код руками(или написал, но после постояно копипастишь его), а в нём, к примеру, может буква "е" к примеру русским написана - попробуй ручками написать ![]() 2. У тебя талантище устанавливать компиляторы - толи ты постоянно сам удаляешь этот файл, то ли ещё чего делаешь ![]() |
Автор: DreLaZ 12.10.2007, 16:06 |
Кстати, все и всегда пишу своими руками. Проблема решена: на компе стоял MVS 1.52 и MSV 2005. Пытался компилить в MVS 1.52 ![]() |
Автор: Rickert 12.10.2007, 16:14 |
Уважаю ![]() |
Автор: DreLaZ 12.10.2007, 17:18 |
Установил Microsoft Visual Studio 2005 Express Edition (2,7Gb-наверное нормальной конфигурации). При запуске проги поставил стандартные настройки с++. Но не могу разобраться в проге. Что выбрать в New (глаза разбегаются при выборе), чтобы написать код программы? |
Автор: archimed7592 12.10.2007, 17:20 |
Что-то вроде new project->c++->win32->win32 console |
Автор: DreLaZ 12.10.2007, 17:42 |
Я так понял, что Microsoft Visual Studio 2005 Express Edition усовершенствованный С++? И там "другая номенкулатура". Я новичек в с++ и прогал тока на borland c++ 4.5 |
Автор: archimed7592 12.10.2007, 17:47 | ||
Скажем так: любой компилятор вводит свои расширения(ибо стандарт некоторые вещи вообще не оговаривает, к примеру, как создать динамическую библиотеку аля dll/so). Что ты под номенклатурой понимаешь? |
Автор: DreLaZ 12.10.2007, 17:58 | ||||
Ну к примеру написать программу на паскале, чтоб она выводила "Hello" и аналогичную на с++. Один и тот же результат, но разный код. Так и между borland с++ 4,5 и MVS 2005 Express Edition. То чему я научился в с++ я не могу использовать в MVS S 2005 Express Edition. Хотя почитав немного лит-ры по нему можно переучиться. Но стоит ли? зы может, что я что-то делаю в MVS 2005 Express Edition неправильно. Ведь там много настроек при выборе нового файла. ![]() |
Автор: archimed7592 12.10.2007, 18:04 |
DreLaZ, есть куча отличий в языке, в связи с тем, что VS-8 соответствует стандарту, скажем, на 85%, а BC-4.5, скажем, на 7%(цифры с потолка - это чтобы ты контраст почуствовал). Ты покажи что у тебя не получается, мы тебе скажем что не так. |
Автор: DreLaZ 12.10.2007, 18:22 | ||||
Начну с простого. Книга меня учила (занимаюсь самообучением), для того чтобы вывести на экран надпись: надо подключить библиотекy iostream описать функцию main и тд............. т.е. имеем прогу
прога компилится без проблем в borland c++ 4.5, а также в visual studio 1.52. А прога представленная ниже, которую представляет книга не компилится в этих 2-ух компилляторах.
В этой же теме мне посоветовали использовать MVS 2005 Express Edition. Но я не могу разобраться в ней и так понял, что к простому с++ она не имеет отношения(код по другому пишется, хотя некоторые моменты похожы). Также как билдер к с++ зы помогите определиться с компиллятором |
Автор: archimed7592 12.10.2007, 18:45 | ||
Это что? Плохая книга, раз не сказали, что нужно подключать ещё и ostream, а то что писать return 0 в main нафик не нужно ![]() File->New->Project...->Visual C++->Win32->Win32 Console Application В поле Name пишешь имя проекта(test, к примеру). В появившемся wizard'е жмёшь Next, потом ставишь галочку empty project, потом Finish. Потом Project->Add New Item...->Visual C++->Code->C++ File(.cpp) В поле Name пишешь имя файла(main, к примеру). Открывается редактор. Там пишешь
Build->Build Solution. Debug->Start without debugging. Видишь чёрный экран и надпись Hello World. |
Автор: Dronchik 12.10.2007, 18:55 | ||
А на Visual C++ 6 всё это пишется так
|
Автор: DreLaZ 12.10.2007, 19:02 | ||||||||
Большое спасибо!!! Всё получилось.
вообще-то microsoft visual c++ 1.52 (cкачал с инета)
Книга "с++ за 21 день" (для новичка думаю как раз, потом можно посмотреть что-то другое). Зачем подключать ostream? Согласен, что и return там не нужен. зы что еще изменилось из стандартов не считая .h и std? Добавлено через 1 минуту и 10 секунд
Оно и на Borland c++ 4.5 также пишется. |
Автор: archimed7592 12.10.2007, 19:19 |
Покажи скриншот, а? А лучше ещё и ссылку дай на это чудо ![]() Да я шутю ![]() ![]() Ну фишка в том, что, когда ты пишешь std::cout << blablabla; ты по сути вызываешь std::cout::operator<<(blablabla); или std::operator<<(std::cout, blablabla); (в зависимости от типа blablabla... кстати могут быть и ещё более извращённые случаи). Так вот, Стандарт оговаривает то, что iostream содержит объявления объекта cout, но не гарантирует того, что этот заголовочный содержит определение класса basic_ostream(экземпляром которого cout и является). Т.о. может сработать ADL и вызваться не тот оператор или вообще может не скомпилировать. Под "может" я подразумеваю имеет право по Стандарту - в реальности всё конечно работает и без ostream. А откуда такая согласность ![]() Ф-ция, возвращающая не void(в данном случае int) должна что-нибудь возвращать, разве нет? ![]() Просто Стандарт явно оговаривает, что, если main ничего не возвращает явно, то компилятор должен неявно вставить туда return 0; ![]() Ну, учитывая то, что на момент появления BC-4.5 Стандарта не было вообще, то очень много ![]() Из очень заметного - default int и templates. А так, скорее всего ещё *_cast, mutable, и много чего другого. Очень многие изменения в тонкостях, которые так просто не заметишь... |
Автор: DreLaZ 12.10.2007, 21:37 | ||
вот это http://www.vetusware.com/download/Visual%20C++%201.52c/?id=4114 |
Автор: archimed7592 12.10.2007, 21:40 |
Да уж... Раритет ![]() |
Автор: Rickert 13.10.2007, 06:05 | ||
archimed7592 Насколько мне известно из книги "С++: стандартная библиотека" от Николая Джосьютиса: по стандарту принято, чтобы main Описывался след. образом:
При успешном завершении - 0. |
Автор: tdebugger 13.10.2007, 07:36 |
Хочу предупредить о такой специфической ошибке - если в среде VS создаете визардом консольный проект, то #include <iostrem> надо прописывать в файле stdafx.h, а не там, где main... |
Автор: archimed7592 13.10.2007, 09:07 | ||||||||||
tdebugger, не стоит предупреждать о том, чего толком не понимаешь ![]() Если отключены precompiled headers(потом я и показывал на примере empty project), то stdafx.* можно вообще удалить. Если включены, то единственное условие, которое накладывается на модули трансляции - это, чтобы первым include'ом был stdafx.h - в остальном модули ничем не отличаются. Rickert, эхх... Если бы ещё все книги правильно писали...
|
Автор: Rickert 13.10.2007, 09:37 |
Ну и где правда? |
Автор: iura 13.10.2007, 11:32 |
как получу доступ к IDE |
Автор: tdebugger 13.10.2007, 18:41 | ||||||
Согласен.
Да, но это здесь причем. Не говоря уж о том, что с инклудными файлами работает препроцессор...
Ты знаешь - молодец, а http://forum.vingrad.ru/index.php?showtopic=171656&view=findpost&p=1251027 досадные ошибки делают... |
Автор: archimed7592 13.10.2007, 19:15 | ||
С трёх раз угадаешь? Ну ладно, приведу аналогию: Есть УК-РФ в котором сказано за убийство человека светит X лет. Есть недописатель недолитературы, который утверждает что за убийство человека в Росии сажают на Y лет. Кто прав? Скорее всего, как всегда выдрано из контекста и неправильно понято тобой и писатель тут не при чём(Джосатиса не читал, но слышал только хорошие отзывы). ![]() Ребят, особенно новички: Стандарт ISO/IEC 14882:2003 - это закон. Любой компилятор("IDE") - это всего лишь реализация, которая не всегда соответствует Стандарту и не всегда результат его работы обязан работать "правильно"(j = (i++) + (i++); яркий тому пример).
Угу, но по стандарту компиляция модуля трансляции - это монолитный процесс, а то что конкретные реализации разбивают его на этапы(препроцессинг, компиляция, сборка) - это, опять же, их интимное дело. Я имел ввиду то, что делать iostream(и всё стандартную библиотеку) абстракцией - это дороже, чем просто реализовать её "с нуля"(как будто в компиляторе её нет) в неабстрактных файлах, которые "СУЩЕСТВУЮТ", тем более, что Стандарт предоставляет для этого все возможности. Я тебе о том, что совет твой не правильный. Общий совет выглядит так: любой модуль трансляции должен начинаться с #include "stdafx.h", а то что лично ты предпочитаешь запихивать все заголовочные файлы в stdafx(и не писать их в самих модулях) - это плохо, ибо stdafx нужен для precompiled headers, а никак не для всеобщего сборища зависимостей. Не надо учить новичков плохому стилю ![]() |
Автор: Rickert 14.10.2007, 06:56 |
archimed7592, сам суди:![]() |
Автор: archimed7592 14.10.2007, 07:36 | ||
Rickert, ну и сравни теперь это с тем что ты сказал
Я ничего общего не вижу ![]() |
Автор: MAKCim 14.10.2007, 09:44 | ||||||
если бы стандартизовать порядок вычисления (например слева направо) то никакой неоднозначности бы не было 1) temp1 = i 2) i = i + 1 3) temp1 = temp1 + i 4) i = i + 1 5) j = temp1 таким образом однозначно раскручивается любой сложности выражение
разворачиваем в
1) temp1 = i 2) i = i + 1 3) temp1 = temp1 + i 4) temp1 = temp1 - i 5) i = i - 1 6) temp1 = temp1 + i 7) i = i + 1 8) i = temp1
разворачивается в i = i * ((i - (-i + ++i - --i) * i) / ++i) 1) temp1 = i 2) temp2 = i 3) temp3 = -i 4) i = i + 1 5) temp3 = temp3 + i 6) i = i - 1 7) temp3 = temp3 - i 8) temp3 = temp3 * i 9) temp2 = temp2 - temp3 10) i = i + 1 11) temp2 = temp2 / i 12) temp1 = temp1 * temp2 13) i = temp1 |
Автор: archimed7592 14.10.2007, 10:08 |
MAKCim, как только договорюсь с ГОСТ'ом о том, чтобы принимать участие в работе WG21, так сразу займусь этим вопросом ![]() Нет, на самом деле, мы же не стандартизируем ничего - есть Стандарт, мы и компилятор ему пытаемся следовать(для того он и нужен - чтобы все были максимально довольны). И напоследок: ты не задумывался, почему этот порядок не стандартизирован ![]() |
Автор: MAKCim 14.10.2007, 10:10 | ||||
просвети ![]() на самом деле не задумывался Добавлено через 2 минуты и 2 секунды
я не понимаю, почему стандарт не может обязать производить вычисления в определенном порядке ![]() |
Автор: archimed7592 14.10.2007, 10:22 |
Ты вот так любишь асм, а за что? За скорость ![]() Вот и здесь тоже: оптимизатору даётся свобода действий. |
Автор: MAKCim 14.10.2007, 10:31 |
аргумент тут и не поспоришь ![]() хотя тут можно включить следующую логику в действия оптимизатора: 1) если какая либо переменная изменяется в правой части выражения 2 и более раз => использовать стандартизованный порядок вычисления для нее, иначе - порядок определяется реализацией 2) переменная изменяется в правой части выражения <=> к ней применяются следующие операторы а) префиксные и постфиксные ++, -- б) +=, -=, *=, /=, >>=, <<=, %=, &=, |=, ^= |
Автор: archimed7592 14.10.2007, 10:40 | ||
Макс, жжошь ![]()
И какой же порядок использовать? Или может быть Стандарту запретить раздельную компиляцию ;)? Или может обязать компоновщик отслеживать такие связи? Добавлено через 1 минуту и 54 секунды Кстати, понятий оптимизатора и его логики в Стандарте нет как таковых ![]() |
Автор: MAKCim 14.10.2007, 10:52 | ||
archimed7592, усилим алгоритм для ссылок и указателей применяем стандартизованный порядок
мы говорим о порядке вычисления выражения компилятор должен руководствоваться этим порядком в том числе и для оптимизации тем самым нам и не надо вводить понятие оптимизатора и его логику в стандарт в стандарте - порядок вычисления, и все |
Автор: Rickert 14.10.2007, 16:27 |
archimed7592, там указано два варианта. |
Автор: archimed7592 14.10.2007, 22:20 |
Я когда-нибудь утверждал что вариант только один? Скорее ты говорил про один вариант, а я лишь толковал о том, что конкретно в main return не обязателен ![]() MAKCim, это был всего-лишь один маленький пример сразу промелькнувший в голове, а если подумать, думаю таких косяков можно много нарыть ![]() В конце концов: j = ++i + i; - здесь переменная меняется только один раз, но, тем не менее, результат не определён ![]() |
Автор: Sketch 15.10.2007, 03:43 |
Совсем уж к чайниким по Си себя не отношу ,не подобная задача завела меня в тупик, надеюсь, кто-нибудь растолкует что к чему ![]() Существует ли функция( или алгоритм), в Си( Си++), позволяющая воспринимать строку, введимую с клавиатуры как часть кода программы. Например, ввод двух любых (по желанию пользователя) математических функций, по которым в дальнейшем ведётся рассчет. |
Автор: DjoNIK 15.10.2007, 07:14 | ||
по идее - нет! Ведь данные и код - две вещи, которые разделены в памяти. |
Автор: archimed7592 15.10.2007, 08:18 |
Sketch, нет, не существует. Только если извращаться и компилировать её на лету. |
Автор: zkv 15.10.2007, 09:06 |
а питон может помочь в этом деле? сам не знаю о нем ничего, поэтому это именно вопрос, а не совет. ![]() |
Автор: archimed7592 15.10.2007, 09:15 | ||
Только если Boost.Python ![]()
AFAICS, имея компилятор нет ничего сложного делать dll'ки на лету. IIRC, у нас один проект именно так и "подгружал" пользовательские ф-ции ![]() |
Автор: tdebugger 6.11.2007, 20:08 |
//Здравствуйте, господа. //Очередной глупый вопрос от новичка: //фрагмент кода на С, какие в нем присутствуют ошибки? int d; int d; struct A { int a; } f(c,b) char b; { struct A a; a.a=10; c=a.a; return a; } |
Автор: archimed7592 6.11.2007, 20:14 |
Ну, хоть и gcc не воспринимает это как ошибку(не знаю должен ли), но это немного странно - делать две переменные с одним именем. Синтаксических - никаких. Но ф-ция делает какие-то странные действия. зы. Используй тег code, пожалуйста. |
Автор: tdebugger 6.11.2007, 20:33 | ||
Пожалуйста
|
Автор: tdebugger 6.11.2007, 22:18 |
Возможно, хотя микроскоповский© компилятор без нее ругается... Не суть важно. Синтаксических ошибок здесь действительно нет(за исключением однострочных комментариев, они, вроде как, в С++ появились), я хотел обратить внимание на определение функции, а конкретнее - на тип возвращаемого значения... Меня давно занимал вопрос: почему в С++ после описания типа нужно ставить точку с запятой, хотя в других языках как то и без нее обходятся. И вот неожиданная разгадка - в старом добром С(без плюсов) разрешалось описывать тип там, где указывается тип возвращаемого значения функции(простите за то, что не хватает умных слов для грамотного выражения мыслей), впоследствии от такой возможности в С++ отказались, потому как гибкости не прибавляет, а ошибок - сколько угодно. Вот и пришлось добавить точку с запятой, чтобы избежать двусмысленности. ...а может я не прав? |
Автор: archimed7592 6.11.2007, 22:24 | ||
С этого нужно было начинать ![]() Прав - это одно из отличий С++ от С. Об этом, IIRC, даже сказано в D&E(и, соответственно, объяснено почему это было убрано из языка). Я сначала уже начал было тебе писать про точку с запятой после определения структуры, как вдруг заметил c-style определение ф-ции. Отсюда и вывалилось незавершённое предложение про точку с запятой, которое я забыл удалить перед постингом ![]() |
Автор: sharp 7.11.2007, 09:55 |
Здравствуйте. Как можно преобразовать тип double в тип char или string? |
Автор: zkv 7.11.2007, 10:06 | ||||
1. потери весьма вероятны:
может имел ввиду char * ? 2.
|
Автор: sharp 7.11.2007, 10:42 |
Мне нужно именно в массив char-ов перевести. А не в char* |
Автор: sharp 8.11.2007, 07:45 |
Мне нужно перевести в такую единицу измерения, которую сможет вывести в TextBox функция SetDlgItemText. А с твоим примером zkv, компилятор ругаеться. Говорит что не может перевести из const char* в char. |
Автор: sharp 8.11.2007, 12:43 |
Я например должен сложить числа с дробями записанными пользвателем в текстбокс1 и текстбокс2 и записать сумму в текстбокс3. Я делаю по такому алгоритму: функцией GetDlgItemText присваиваю текстовые значения перемынным. Функцией atof перевожу из char в double. Выполняю необходимые действия. Перевожу обратно в char результат(вот это и не получаеться). Записываю в textbox3 его функцией SetDlgItemText. |
Автор: zkv 8.11.2007, 16:36 | ||
в моем примере нигде не фигурирует const char* ![]() |
Автор: kurtis 8.11.2007, 16:56 | ||
помогите что вклиниваюсь, но что-то я сильно торможу...
почему в структуре нельзя инициализировать массив???(интересует именно C89 либо C99) |
Автор: archimed7592 8.11.2007, 17:11 | ||
Ну, примерно потому же, почему нельзя инизиализировать int в typedef'е:
|
Автор: sharp 9.11.2007, 18:57 | ||
А почему тогда компилятор выдаёт такую ошибку???
|
Автор: archimed7592 9.11.2007, 19:13 |
Приведи полностью код и укажи на какую конкретно строку он ругается. Ещё компилятор озвучить неплохо было бы... |
Автор: NiCketT 9.11.2007, 19:18 | ||
Почему не работает такой кусок кода?
Работал (вводил с клавы число, втыкал ее в функцию SS и выводил результат) а тепеь не работает. Пробовал под Борландом, ВижулСтудио и gcc - везде виснит! ![]() |
Автор: sharp 9.11.2007, 19:36 | ||
Компилятор Visual C++ 6 |
Автор: archimed7592 9.11.2007, 20:11 | ||
Насколько я понимаю, в эту ф-цию нужно передавать c-строку, а ты пытаешься передать символ. Как это относится к примеру zkv я не догоняю ![]() |
Автор: NiCketT 9.11.2007, 21:12 |
уже разобрался - ошибка была гдето в форе |
Автор: archimed7592 9.11.2007, 21:14 |
![]() |
Автор: sharp 10.11.2007, 05:48 | ||
archimed7592, charValue у меня объявленна как charValue[10]; Попробывал преобразовать в string, выдаёт такие ошибки
|
Автор: archimed7592 10.11.2007, 10:25 |
#include <string> #include <ostream> #include <sstream> |
Автор: magadan87 10.11.2007, 10:38 | ||
такой вот вопрос
получаем ошибку "ошибка: expected expression before '=' token" |
Автор: Fazil6 10.11.2007, 10:56 | ||||
что по твоему define делает?
|
Автор: magadan87 10.11.2007, 11:21 | ||||||
Точно! Извиняюсь, невнимателен. ^^ |
Автор: sharp 10.11.2007, 13:40 | ||
archimed7592,
1 ошибка не хочет исправляться |
Автор: archimed7592 10.11.2007, 13:55 |
Господа новички, телепатов здесь нет! 1. Показывайте свой код. 2. Указывайте номер строки на которую ругается компилятор. 3. Указывайте ошибку полностью(дословно). Добавлено через 1 минуту и 49 секунд sharp, тебе нужно написать ".c_str()", а вот где - сиди, думай, гадай. Если бы нормально задавал вопросы(показывал бы код и т.д.), то сидеть, думать и гадать не пришлось бы. |
Автор: Dronchik 11.11.2007, 08:28 |
извините. не туда запостил. удалите пожалуйста. |
Автор: sharp 11.11.2007, 08:40 |
archimed7592, извини за мою тупость. Ошибка указывала на 3 строку приведённую мной ранее. Я к stringValue добавил .c_str() и всё заработало. Спасибо. |
Автор: archimed7592 11.11.2007, 08:46 | ||||
В коде, который ты приводил ранее c_str вставить вообще некуда, ибо там string не используется. Интересно, если увеличить шрифт ещё пунктов на 10, до новичков дойдёт, что телепатия - явление редкое?
Dronchik, я чё-то недопонял... У тебя 2 профиля? |
Автор: Dronchik 11.11.2007, 08:48 |
нет вроде |
Автор: archimed7592 11.11.2007, 09:13 |
А почему тогда от твоего имени был написан пост слово в слово повторяющий тот, который чуть позже написал sharp? |
Автор: Dronchik 11.11.2007, 09:17 |
archimed7592, низнаю. ПМ тебе отправил чтобы не оффтопить |
Автор: kurtis 12.11.2007, 15:43 | ||
как в функции r_memcpy() определить размер массива lamps, который находится в структуре data_from???
|
Автор: DjoNIK 12.11.2007, 16:51 | ||
В size ты записал не размер массива, а размер указателя на первый элемент массива. Если не ошибаюсь, то размер массива, в общем случае, невозможно определить. Поэтому в функцию всегда передается помимо указателя на сам массив еще и его размер. PS: Извиняюсь за частое употребление слова массив. Добавлено через 4 минуты и 46 секунд Что-то я задумался... Тебе нужно узнать размерность (сколько элементов) массива или, все же, размер каждого элемента? Если последнее, то
|
Автор: kurtis 12.11.2007, 16:59 |
мне нужно узнать количество элементов!!! может я решаю задачу через одно место, но мне нужно все переменные в массиве lamps обработать определенным образом, а другие не трогать!!!т.е. мне нужно как-то обратится к этому массиву в структуре....как это сделать лучшим образом я незнаю.... |
Автор: Fazil6 12.11.2007, 17:25 | ||||
|
Автор: kurtis 12.11.2007, 17:35 |
Спасибо за интересную идею.... нужно все это оформить на жестком СИ (НЕ СИ++), а то, под что я это пишу, с Си++ не дружит(компилятора нету)!!!!=)))))) |
Автор: archimed7592 12.11.2007, 18:52 |
Почему не static_cast? |
Автор: Fazil6 12.11.2007, 19:07 |
можно и static_cast |
Автор: bsa 12.11.2007, 23:53 | ||
STRUCT_FROM *pdst = reinteret_cast<STRUCT_FROM *>(dst); замени на STRUCT_FROM *pdst = (STRUCT_FROM *)dst; |
Автор: Dims 13.11.2007, 19:58 |
А что такое эти "паттерны" и как ими пользоваться? |
Автор: JackYF 13.11.2007, 20:17 |
Фраза откуда выдрана вообще? Тебя в гугле забанили? |
Автор: Fazil6 13.11.2007, 20:17 |
а что такое эти "словари" всякие да "энциклопедии" и как ими пользваться? http://ru.wikipedia.org/wiki/Паттерн |
Автор: Dims 13.11.2007, 23:18 |
![]() Ну я, наверное, понимаю в принципе, что это такое. Но никогда не пользовался и не пойму, как практически этим пользоваться. Вроде бы это не библиотеки, а какой-то набор "решений" с классами. Какое преимущество они дают? Разве не проще самому придумать класс? И наоборот, разве паттерн потом не придётся всё равно переиначивать под конкретный случай? Не получится ли так, что зазубривание паттернов и раздумья, какой же из них подойдёт для твоего случая, займёт больше времени, чем просто придумать себе класс? Выглядит, как систематизация изобретений. Но, как я понимаю, этим пользуются. Значит, наверное, я ошибаюсь. И паттерны это не совсем то, что я думаю и в них есть какая-то польза. Вот меня недавно спросили "какими паттернами ты пользуешься в работе". А я и не знаю, что ответить. Действительно ли эти паттерны помогают? |
Автор: DjoNIK 13.11.2007, 23:33 | ||
Если у тебя будет опыть (хотя бы небольшой), то однозначно НЕТ! |
Автор: archimed7592 13.11.2007, 23:58 | ||||
При разумном применении, получаемые преимущества - это, как минимум: гибкость, расширяемость, простота применения. Смотря что понимать под словами "проще". Бывает, что "проще"(меньше напрягая мозг) писать логику прямо в обработчиках событий, но реальная выгода от такой "простоты" весьма сомнительна.
Цель паттернов - не предоставить универсальную библиотеку, а обобщить основные, часто применяемые проектные решения.
"Зазубривание" вообще, как правило, никогда не оправдывает потраченного времени и редко приносит реальную выгоду. Да, если они "стекают с кончиков пальцев" ©. В противном случае, появляется вот такое как у тебя недопонимание "а зачем это вообще нужно?", но, со временем и опытом приходит всё. |
Автор: Dims 14.11.2007, 01:23 |
Ну вот, допустим, я хочу приобрести опыт общения с паттернами. Что мне нужно делать? Справочник паттернов какой-то нарыть? И потом, решая практические задачи, пытаться выискивать в этом справочнике нужный паттерн? |
Автор: archimed7592 14.11.2007, 01:52 |
Для начала попытаться понять зачем нужен каждый паттерн. Посидеть, повспоминать то что ты уже делал и подумать, где бы ты какой паттерн мог бы применить. Потом просто продолжать работать, как работал - у тебя само собой будет появляется желание сделать неуклюжую попытку применить тот или иной паттерн. Потом эти попытки станут более "уклюжими" ![]() Сама книга, неустаревающая классика жанра - http://www.ozon.ru/context/detail/id/2457392/. Могу только пожелать удачи в хорошем(я бы сказал очень правильном) начинании ![]() |
Автор: VladimirC 14.11.2007, 16:44 |
А не моглибы вы подсказать,новичку, как сделать так чтобы определенная команда,строка выполнялась только по прошествии определенного промежутка времени? |
Автор: DjoNIK 14.11.2007, 16:54 | ||
Если ты хочешь, что бы "промежуток времени" был аппаратно независим, то, если я не ошибаюсь, тебе нужно создавать отдельный поток. Но так как ты новичок, то, возможно, цикл по сетчику тебе поможет. |
Автор: VladimirC 14.11.2007, 21:15 |
а можно немножко поподробнее, как я понял просто сделать одну постоянно повторяющуюся, Х раз, команду? так? а если не сложно можно примерчик? ![]() ![]() |
Автор: Dims 15.11.2007, 05:20 |
Ну ты циклы умеешь делать? Операторы for, while, do? |
Автор: VladimirC 15.11.2007, 19:27 |
конечно ,толко что надо вписать в этот цикл? какая команда отвечает за этот счетчик? |
Автор: zkv 15.11.2007, 23:03 | ||
десять раз вызвать X();
|
Автор: AndrRus 15.11.2007, 23:16 |
VladimirC, если я правильно понял, то ты хочешь просто оттянуть время в программе? Если да, то самым глупым способом - это можно сделать следующим образом: складывать бесконечно малую величину каким-либо из предложенных тебе циклов, пока она не станет значимой. |
Автор: bsa 15.11.2007, 23:48 | ||
Паузу можно задать определенными командами. Например sleep(unsigned sec) - пауза на sec секунд. Можно и другими, более точными, но для этого ты должен сказать, что у тебя за ОС и какой компилятор. |
Автор: VladimirC 16.11.2007, 19:36 |
bsa спасибо этого ответа я и ждал) попробую) |
Автор: bsa 16.11.2007, 22:29 | ||
Прочти мою подпись и запомни. ![]() |
Автор: kurtis 23.11.2007, 14:51 | ||||
скорее всего это уже где-то было, но все-таки... В чем смысл объявления функции как static???
В чем смысл такой вот штуки и что она вообще значит???конктретно смущает слово struct перед функцией!!!
заранее спасибо!!!=) |
Автор: JackYF 23.11.2007, 14:58 |
это тип возвращаемого значения функции. область видимости функции ограничивается одним модулем. |
Автор: archimed7592 23.11.2007, 14:59 |
kurtis, оба вопроса - пережиток языка Си. В С++ вместо static используюется namespace {}(анонимное пространство имён), а struct перед именем типа структуры писать не нужно. |
Автор: kurtis 23.11.2007, 15:16 |
спасибо, помогло!!!=)) |
Автор: Hehe 18.3.2008, 00:26 | ||
Проблема:
|
Автор: korian 18.3.2008, 04:07 |
generic<class T> where T : MyInterface<T> это что за конструкция? С++? я так понимаю надо в объявление функции добавить MyClass<T> |
Автор: Hehe 18.3.2008, 04:35 | ||
Да, это конструкция Managed C++. Говорит, что тип T унаследован от MyInterface. А вот этот момент попросил бы пояснее. Надо было, наверно, раньше написать - если использовать вместо operator *, например, operator +, то все будет замечательно. |
Автор: Hehe 18.3.2008, 05:43 | ||||
Ура. Проблема решена. вместо вызова
|