| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > operator[] и указатели |
| Автор: Fighter 21.12.2005, 01:59 |
| Проблема вот в чем. Я создал класс, в нем я перегрузил operator[], который возвращает указатель на структуру. Затем, в создаю объект как указатель (через функцию new). например, пусть я создал класс Database и структуру Person; class Database { Person* operator[](int offset); }; Теперь в программе я пишу int main() { Database* db; Person *pPerson; pPerson = db[2]; } И он мне выводит что он не может конвертировать Database в Person*. Я так понял что нужно разыменывать, только я вот не знаю как. |
| Автор: BreakPointMAN 21.12.2005, 02:30 |
| Ни хрена непонятно... Приведи весь код... Что-то ты СОВСЕМ не то делаешь... |
| Автор: Fighter 21.12.2005, 03:01 | ||
Ой, я короче уже исходник удалил, мне уже вроде как не надо. Ну, короче, как надо перегрузить оператор operator[] в классе связанного списка, чтобы со связанным списком можно было работать как с массивом. |
| Автор: Earnest 21.12.2005, 08:44 | ||||
Вместо
надо писать
потому что у тебя оператор [] определен для класса DataBase, а db - это указатель на него. Вот это операция: *db и называется разыменованием. |
| Автор: pablo 21.12.2005, 09:36 |
| если я правельно понял вопросс, то может лучше было бы не возвращать указатель на структуру, а просто значение (т.е разыменовать указатель перед возвратом) |
| Автор: comcon1 21.12.2005, 12:21 | ||||
| Возможно, ты неправЕльно понял вопрос. Возврат неконстантого указателя позволяет производить операции с памятью для тех структур, на которые указывают эл-ты массива. Кроме того, возврат указателя (и константного тоже) всегда менше времени занимает, чем возврат целой структуры. Ты понимаешь, что при возврате структуры для нее запускается конструктор копирования? В случае, когда у тебя много обращений к структуре, выгодней по времени иметь реальный ее инстанс в своей програме. ( Если я не прав, исправьте меня. ) Например так:
быстрее чем так
Собственно по теме: -- Для этих целей имеется шаблон: boost::pointer_array. Вот так. Появился в 1_33. |
| Автор: blackofe 21.12.2005, 18:56 | ||||
Earnest дело говорит. оператор [] переопределен для класса Database, а не для указателя на него. посему будет правильным:
или же
а db[2] у тебя будет указывать на 3-й элемент в массиве из объектов типа Database. |
| Автор: Fighter 22.12.2005, 17:28 |
| Спасибо, разобрался, теперь все работает. |
| Автор: Fighter 22.12.2005, 22:04 | ||
А кстати, вот еще вопрос возник. Можно ли ускорить поиск нужного элемента (в общем отказаться от цикла). Дело в том, когда будет очень много значений в связанном списке, чтобы обратиться к последнему нужно будет пройти все элементы, а это не экономично. Можно использовать что-нибудь, например, типа таких конструкций:
|
| Автор: DeadSoul 22.12.2005, 22:35 | ||
Храни указатель на последний элемент.
Такого со списком достичь невозможно. В массиве(std::vector и аналоги) есть быстрый доступ к любому элементу В списке(std::list или твой) есть возможность быстрой вставки\удаления в середину Добится сразу двух эффектов невозможно |
| Автор: Earnest 23.12.2005, 17:03 |
| Ну почему же... map, например, или hash_map реализуют вполне приемлимый компромисс, когда и доступ, и вставка вполне быстрые... В общем, Fighter, раз уж ты пишешь Database, то надо подумать и об индексировании. |
| Автор: DeadSoul 23.12.2005, 22:32 | ||
Переформулируем: - невозможно создать контейнер, удовлетвояющий следующим условиям: 1. Вставка\Удаление элемента в любое места занимает О(1) операций 2. Доспут к любому элементу осуществляется за О(1) операций |
| Автор: GremlinProg 25.12.2005, 12:56 |
| почему бы не использовать бинарное дерево или AVL-дерево |