Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> operator[] и указатели 
:(
    Опции темы
Fighter
Дата 21.12.2005, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 810
Регистрация: 5.1.2005

Репутация: нет
Всего: 2



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

Затем, в создаю объект как указатель (через функцию new).

например, пусть я создал класс Database и структуру Person;

class Database {
Person* operator[](int offset);

};

Теперь в программе я пишу

int main()
{
Database* db;
Person *pPerson;
pPerson = db[2];
}

И он мне выводит что он не может конвертировать Database в Person*. Я так понял что нужно разыменывать, только я вот не знаю как.
PM MAIL   Вверх
BreakPointMAN
Дата 21.12.2005, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 14
Всего: 24



Ни хрена непонятно... Приведи весь код... Что-то ты СОВСЕМ не то делаешь...


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
Fighter
Дата 21.12.2005, 03:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 810
Регистрация: 5.1.2005

Репутация: нет
Всего: 2



Цитата(BreakPointMAN @ 21.12.2005, 02:30)
Ни хрена непонятно... Приведи весь код... Что-то ты СОВСЕМ не то делаешь...

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

Ну, короче, как надо перегрузить оператор operator[] в классе связанного списка, чтобы со связанным списком можно было работать как с массивом.
PM MAIL   Вверх
Earnest
Дата 21.12.2005, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Вместо
Код

pPerson = db[2];

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

pPerson = (*db)[2];

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


--------------------
...
PM   Вверх
pablo
Дата 21.12.2005, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

Репутация: 4
Всего: 6



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


--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
comcon1
Дата 21.12.2005, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



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

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

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

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.

Это сообщение отредактировал(а) comcon1 - 21.12.2005, 12:24


--------------------
PM MAIL   Вверх
blackofe
Дата 21.12.2005, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



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

Код

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

или же

Код

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


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

Это сообщение отредактировал(а) blackofe - 21.12.2005, 19:02
PM MAIL   Вверх
Fighter
Дата 22.12.2005, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 810
Регистрация: 5.1.2005

Репутация: нет
Всего: 2



Спасибо, разобрался, теперь все работает.
PM MAIL   Вверх
Fighter
Дата 22.12.2005, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 810
Регистрация: 5.1.2005

Репутация: нет
Всего: 2



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

Код


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


PM MAIL   Вверх
DeadSoul
Дата 22.12.2005, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



Храни указатель на последний элемент.

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

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



--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Earnest
Дата 23.12.2005, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



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


--------------------
...
PM   Вверх
DeadSoul
Дата 23.12.2005, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



Цитата(Earnest @ 23.12.2005, 17:03)
Ну почему же...

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


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
GremlinProg
Дата 25.12.2005, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 3
Всего: 106



почему бы не использовать бинарное дерево или AVL-дерево


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0695 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.