Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата(BreakPointMAN @ 21.12.2005, 02:30)
Ни хрена непонятно... Приведи весь код... Что-то ты СОВСЕМ не то делаешь...

Ой, я короче уже исходник удалил, мне уже вроде как не надо.

Ну, короче, как надо перегрузить оператор operator[] в классе связанного списка, чтобы со связанным списком можно было работать как с массивом.

Автор: Earnest 21.12.2005, 08:44
Вместо
Код

pPerson = db[2];

надо писать
Код

pPerson = (*db)[2];

потому что у тебя оператор [] определен для класса DataBase, а db - это указатель на него.
Вот это операция: *db и называется разыменованием.

Автор: pablo 21.12.2005, 09:36
если я правельно понял вопросс, то может лучше было бы не возвращать указатель на структуру, а просто значение (т.е разыменовать указатель перед возвратом)

Автор: comcon1 21.12.2005, 12:21
Возможно, ты неправЕльно понял вопрос. Возврат неконстантого указателя позволяет производить операции с памятью для тех структур, на которые указывают эл-ты массива.

Кроме того, возврат указателя (и константного тоже) всегда менше времени занимает, чем возврат целой структуры. Ты понимаешь, что при возврате структуры для нее запускается конструктор копирования?

В случае, когда у тебя много обращений к структуре, выгодней по времени иметь реальный ее инстанс в своей програме. ( Если я не прав, исправьте меня. )
Например так:
Код

DataBase db;
// manipulations with DB
 Person __cur( *(db[6]) );
for (int i=1; i < 20000; ++i)
  cout << ( sin(__cur.x + i) ) << endl;

быстрее чем так
Код

DataBase db;
// manipulations with DB
 Person *__cur =  db[6];
for (int i=1; i < 20000; ++i)
  cout << ( sin(__cur->x + i) ) << endl;


Собственно по теме:
-- Для этих целей имеется шаблон: boost::pointer_array. Вот так. Появился в 1_33.

Автор: blackofe 21.12.2005, 18:56
Earnest дело говорит. оператор [] переопределен для класса Database, а не для указателя на него. посему будет правильным:

Код

Database* db;
Person *pPerson = (*db)[2];

или же

Код

Database* db;
Person *pPerson = db->operator [](2);


а db[2] у тебя будет указывать на 3-й элемент в массиве из объектов типа Database.

Автор: Fighter 22.12.2005, 17:28
Спасибо, разобрался, теперь все работает.

Автор: Fighter 22.12.2005, 22:04
А кстати, вот еще вопрос возник. Можно ли ускорить поиск нужного элемента (в общем отказаться от цикла). Дело в том, когда будет очень много значений в связанном списке, чтобы обратиться к последнему нужно будет пройти все элементы, а это не экономично. Можно использовать что-нибудь, например, типа таких конструкций:

Код


Person* Database::operator[](int offset) 
{
  return this->GetFirst() + offset * sizeof(Person);
}


Автор: DeadSoul 22.12.2005, 22:35
Храни указатель на последний элемент.

Цитата(Fighter @ 22.12.2005, 22:04)
return this->GetFirst() + offset * sizeof(Person);

Такого со списком достичь невозможно.
В массиве(std::vector и аналоги) есть быстрый доступ к любому элементу
В списке(std::list или твой) есть возможность быстрой вставки\удаления в середину
Добится сразу двух эффектов невозможно

Автор: Earnest 23.12.2005, 17:03
Ну почему же...
map, например, или hash_map реализуют вполне приемлимый компромисс, когда и доступ, и вставка вполне быстрые...
В общем, Fighter, раз уж ты пишешь Database, то надо подумать и об индексировании. smile

Автор: DeadSoul 23.12.2005, 22:32
Цитата(Earnest @ 23.12.2005, 17:03)
Ну почему же...

Переформулируем:
- невозможно создать контейнер, удовлетвояющий следующим условиям:
1. Вставка\Удаление элемента в любое места занимает О(1) операций
2. Доспут к любому элементу осуществляется за О(1) операций

Автор: GremlinProg 25.12.2005, 12:56
почему бы не использовать бинарное дерево или AVL-дерево

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)