150 / 73 / 27
Регистрация: 09.04.2010
Сообщений: 297
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
Перегрузка оператора ++ , деструктор и конструктор копий30.07.2010, 14:34. Показов 2542. Ответов 21
Метки нет (Все метки)
Привет всем!
В продолжение Этой темы появились новые вопросы и непонятки. Буду признателен за советы и разъяснения Начну с самого начала... Пишу class - обертку для файла. Цель - упростить операции доступа к содержимому файла. Приблизительный план: (может, как по другому можно) класс должен содержать, и выдавать по требованию, такие данные; текущее положение курсора (номер строки и номер символа в строке) текущий символ. Смещешие курсора сделать с помощью операторов ++ и -- На каждый файл отдельный объект. В конструкторе инициал. поля и загружается часть файла в массив. Дальше будет видно... текущие наработки: file_pos.h
file_pos.cpp
main.cpp
Для перемещения по файлу решил перегрузить операторы инкремента и декемента Сделал смещение вперед (оператор ++) И столкнулся с проблемой: функция operator++ () возвращает объект и каждый раз при возврате из нее вызывается деструктор, в котором освобождается память (а ее освобождать не нужно). Решил проблему с помощью Конструктора копий. И тут, главный, на данном этапе, вопрос Правильно ли сделал конструктор копирования? в нем каждый раз делается копия массива buffer (даже 2 массива file_name и buffer). При прогоне по всем элементам файла такое копирование происходит много раз.. По-моему - это не оптимально Может я не так делаю? Конструктор копирования
0
|
30.07.2010, 14:34 | |
Ответы с готовыми решениями:
21
Почему не вызывается ни конструктор копий, ни функция перегруженного оператора присвоения Конструктор копирования и перегрузка оператора присваивания Класс "Матрица": конструктор, деструктор и перегрузка операторов Определить конструктор без параметров, конструктор с одним параметром, конструктор с двумя параметрами, деструктор |
150 / 73 / 27
Регистрация: 09.04.2010
Сообщений: 297
|
|
30.07.2010, 14:55 [ТС] | 3 |
Подскажите, что имеенно, дурость!
Не по теме: Програмиированием занимаюсь в свободное от работы время, потому профи меня не назовешь ;) Понял, что освобождать нужно через delete
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
30.07.2010, 15:01 | 4 |
Если используешь выделение памяти в стиле C++ (new/new[]), то и высвобождай ее в стиле C++ (delete/delete[]). Нельзя смешивать функции работы с памятью C с операторами С++.
1
|
Maniac
|
|||||||||||||||||||||
30.07.2010, 15:04 | 5 | ||||||||||||||||||||
Чтобы было понятней дополню Nameless One
Тоесть вместо
PS.. Вместо этого
1
|
Модератор
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
|
|
30.07.2010, 15:08 | 6 |
конструкции new / delete в С++ хоть и служат примерно тем же целям, что и malloc() / free() языка С, смешивать их - мягко говоря не лучшая идея. Ну или как ISergey выразился...
1
|
150 / 73 / 27
Регистрация: 09.04.2010
Сообщений: 297
|
|
30.07.2010, 15:26 [ТС] | 7 |
С new/delete я уяснил.
А по-поводу такого вопроса: Необходимо ли так копировать, или может есть другой способ? И надо ли ?
0
|
Maniac
|
|
30.07.2010, 15:31 | 8 |
Для каждого нового объекта своя копия.. так что по другому не выйдет..
PS. Одно не пойму - чем не устроил стандартный класс ofstream/ifstream? Input/Output with files
0
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
30.07.2010, 15:58 | 9 |
FireNovel, тут есть еще интересный момент: в C++ приняты две формы инкремента/декремента - пред- и пост- (прединкремент и постинкремент, и аналогично преддекремент и постдекремент). Поэтому ожидается, что для некоторого класса будут реализованы обе. И сразу же появляются вопросы.....
1. У тебя реализована пред-форма. Что будет делать и как будет работать пост-форма? 2. А каков вообще физический смысл пред- и пост- форм для перемещения "курсора"?
1
|
150 / 73 / 27
Регистрация: 09.04.2010
Сообщений: 297
|
|
31.07.2010, 19:59 [ТС] | 11 |
Сообщение от CheshireCat
Сообщение от ISergey
Сообщение от ISergey
Не знаю может тут и выгоднее использовать ofstream/ifstream. Пока оставлю как есть.
0
|
65 / 71 / 9
Регистрация: 25.06.2009
Сообщений: 244
|
|
31.07.2010, 20:35 | 12 |
0
|
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
|
|
31.07.2010, 21:14 | 13 |
Читаем пункт 5.6 FAQ Конструкторы и деструкторы.
1
|
150 / 73 / 27
Регистрация: 09.04.2010
Сообщений: 297
|
||||||||||||||||
05.08.2010, 13:10 [ТС] | 14 | |||||||||||||||
Примет!
Собственно, я доделал примерно то, что хотел. И вот, что получилось: File_pos.7z file_pos.h
file_pos.cpp
main.cpp
Просьба уделить немного внимания и указать на какую-нибуть лажу Может стоит что-то добавить? И вопросик: как лучше средствами C++ (может в STL есть) скопировать два массива? я сделал так
Сообщение от Copy consuctor
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||||||
05.08.2010, 14:09 | 15 | |||||
С помощью std::copy (требует хедер algorithm):
Кстати, если buffer здесь - стандартная строка Си с нуль-терминатором, то я бы использовал strcpy. Только тогда тебе нужно для this->buffer выделить еще один байт под нуль-терминатор.
1
|
150 / 73 / 27
Регистрация: 09.04.2010
Сообщений: 297
|
||||||
05.08.2010, 14:20 [ТС] | 16 | |||||
В моем случае нужно написать
Вот только вопрос - не быстрее, ли будет это сделать for-ом?
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||||||
05.08.2010, 14:25 | 17 | |||||
А ты под него место выделил? Насколько я помню, strlen не считает нуль-терминатор. Тогда, в твоем случае, нужно делать так:
1
|
05.08.2010, 14:28 | 18 |
for-ом точно не быстрее как максимум также.
а вообще все правильно, самые быстрые варианты будут скорее всего strcpy и memcpy, что по сути одно и тоже, так как они копируют не поэлементно, а блоками памяти.
2
|
150 / 73 / 27
Регистрация: 09.04.2010
Сообщений: 297
|
|
05.08.2010, 14:51 [ТС] | 19 |
И еще один вопросик (скорее философский)...
Как определить, что класс готов? Ведь, при разработке его, очень часто, в голову лезут разные идеи. И вроде бы и так сделать можно, и эдак - было бы хорошо организовать... И потихоньку увязаешь в коде Посоветуйте пожалуйста как поступить
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
05.08.2010, 14:53 | 20 |
FireNovel, Поставьте одну цель, что должен делать класс, и не расширяйте пока не сделаете класс таким как поставили. Ну а затем уже по личным приоритетам, может что-то доделать, может что-то добавить и т.д.
0
|
05.08.2010, 14:53 | |
05.08.2010, 14:53 | |
Помогаю со студенческими работами здесь
20
Конструктор инициализации, конструктор копирования, деструктор Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор Конструктор копий Конструктор копий Конструктор копий Конструктор копий Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |