Sdrastvuyte. Y zadaval voporos kak peregruzit operator new[]. Spasibo expertam "JADD" i "AV1k". No u mne nado eto v BC31 a tam ne rabotaet takaya zapis. Compilator pishet "Not an allowed type" i "Operator must be declared as function" esli nelsa peregrusit v etom compilatore, esli net ne budu vas dostavat. Spasibo.
Приветствую Вас, Sasha! Похоже компилятор в BC++ 3.1 еще не поддерживает перегрузку этого оператора, но с этим ничего не поделаешь :( Могу посоветовать завести свой allocator и выделять/удалять память с помощью неких его функций (если конечно выделение памяти полностью контролируется Вашим кодом) или перейти на другой компилятор, например VC++ (версии >= 5.0) :) C уважением, Avl2k. Ответ отправлен: 15.12.2002, 14:10 Отправитель: Avl2k Отвечает Jadd
Добрый день, Sasha! В примере я уже вижу ошибки. Если они и в тексте, то все понятно. Пример, который я прислал раньше, я пробовал на BC 4.5 при подготовке к сертификации и все работало. Я не помню всех нюансов BC 3.1. Уж извини. Ответ отправлен: 16.12.2002, 05:08 Отправитель: Jadd
Вопрос № 443
Доброе время суток, уважаемые эксперты. Читаю Страуструпа "Язык программирования С++. 3-е издание" наткнулся на следующий код (привожу выдержку из книги стр.79): ******************************************************* template void copy(In from, In too_far, Out to) { while (from != too_far) { *to = *from // копируем элемент, на который указывает итератор ++to; // следующий выходной элемент ++from; // следующий входной элемент } } Приведенный пример копирует любой контейнер, для которого мы можем определить итераторы с подходящим синтаксисом и семантикой. char vcl [200], // массив из 200 символов char vc2 [500], // массив из 500 символов void f() { copy{&vcl[0],&vcl[200],&vc2[0]) } ************************************************ Может
надо было так: template void copy(In* from, In* too_far, Out* to) { ... } помогите разобраться. Заранее благодарен, carbonoid. >C=C<
Приветствую Вас, carbonoid! У Страуструпа все правильно написано. Практически вся STL написана в терминах итераторов, т.е. классов, позволяющих итерироваться по контейнерам. Итераторы разделены на категории (например, направленные вперед, двунаправленные или произвольного доступа), и относительно них приняты некоторые соглашения (т.е. что делает *, ++, -- и т.д.). Для большинства контейнеров итераторы не просто указатели, а прямо-таки целые вспомогательные классы, а операторы ++ и -- могут выполнять некую _нетривиальную_ работу (а не только прибавление sizeof некоторого типа, как для указателей). В случае же с char* template void copy(In from, In too_far, Out to) раскрывается в void copy(char* from, char* too_far, char* to) и все сводится к работе с указателями, сравните с vector c1; list c2; c1.push_back( 1 ); c1.push_back(
2 ); c1.push_back( 3 ); copy( c1.begin(), c1.end(), back_inserter( c2 ) ); // копирует с1 в c2 copy( c1.begin(), c1.end(), ostream_iterator( cout, " " ) ); // выводит c1 в cout C уважением, Avl2k. Ответ отправлен: 16.12.2002, 15:30 Отправитель: Avl2k Отвечает vitya
Добрый день, carbonoid! Все верно. Заметь, что проиходит во время копирования массива - после того, как код откомпилируется у тебя будет char * in; char * to; char * too_far; while (in != too_far) { *to = *in; ++in; } *from = vcl[0]; *too_far = vcl[200] - то есть следующий элемент за концом массива. ну а to указывает на начало следующего массива. то есть получается то что надо. Если же написать код, как ты - то будет char ** from; и т.д., что не верно. Ответ отправлен: 17.12.2002, 15:25 Отправитель: vitya Отвечает PL
Добрый день, carbonoid! Конечно нужно передовать указатели, а не объекты. При передачи объектов на *to = *from; Тебе выдаст ошибку о неправильном направлении использования оператора * А если to и from указатели, то эта строка действительно копирует объект лежащий по адрессу на который указывает from и помещает адресс копии в указатель to. Ответ отправлен: 16.12.2002, 15:19 Отправитель: PL Отвечает Jadd
Добрый день, carbonoid! Хехе. Примеры из книг на то и примеры из книг, чтобы не работать. Я часто сталкивался с такими траблами, когда были допущены ошибки либо автором, либо издательством. Подумаешь лишний амперсанд выкинули. Ты смотри на выходные результаты в книге и сам пробуй, вместо того, чтобы сюда писать. Так ты сам станешь Гуру гораздо быстрее. Ответ отправлен: 17.12.2002, 03:19 Отправитель: Jadd
Форма отправки вопроса
Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook"
и "Microsoft Outlook Express". В программе The Bat!
подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте,
что в некоторых браузерах могут стоять запреты на открытие других
окон, а также "чрезмерное" кэширование данных,
при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet
Explorer 5.0+ или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.