[C++] Перегруженный operator[] и указатели (чет не врубаюсь)

Модератор: Модераторы разделов

Аватара пользователя
VoidExp
Сообщения: 208
Статус: Lead guitar adept
ОС: Ubuntu

[C++] Перегруженный operator[] и указатели

Сообщение VoidExp »

Хай! Сразу к делу :) Опять с самопальным движком трабла... Есть класс, в котором перегружен оператор индексации. Все отлично когда работа производится с обычной переменной, но вот когда объект инициализирован в динамической памяти (то есть когда работаю с указателем на объект), не фурычит. Вот пример ситуации:

Код: Выделить всё

class MyClass
{
   public:
      //Ctors and Dtor
      int& operator[](int pos);
   private:
      int cVar[100];
};

int& MyClass::operator[](int position)
{
   //Check for validity of requested element
   if( (position >= 0) && (position < 100) )
       return cVar[position];
}

int main()
{
    //Init
    MyClass* obj = new MyClass;
    int value = obj[7]; //etc...

    //Clean up
    delete obj;
    obj = NULL;
    return 0;
 }


Компилятор ругается фразочкой что "невозможно преобразовать тип MyClass* в int". Как же тогда получить доступ к членам объекта через оператор индексации?? Ну кроме альтернативы написать аналогичную функцию типа Get(position)...
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12

Re: [C++] Перегруженный operator[] и указатели

Сообщение Assuri »

В функции main() вы хотите присвоить int* в int. Если я не ошибаюсь
Спасибо сказали:
Аватара пользователя
Skladnoy
Сообщения: 90
ОС: Debian

Re: [C++] Перегруженный operator[] и указатели

Сообщение Skladnoy »

Правильно ругается.

obj[7] это тоже самое что *(obj + 7) и имеет тип MyClass. Не надо забывать, что указатели и массивы в стиле С почти одно и тоже. А делать надо так:

Код: Выделить всё

  value = (*obj)[7];
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12

Re: [C++] Перегруженный operator[] и указатели

Сообщение Assuri »

Skladnoy писал(а):
24.10.2007 21:08
Не надо забывать, что указатели и массивы в стиле С почти одно и тоже.

Это и так одно и то же ;) По крайней мере так Лафоре говорит.
Спасибо сказали:
Аватара пользователя
VoidExp
Сообщения: 208
Статус: Lead guitar adept
ОС: Ubuntu

Re: [C++] Перегруженный operator[] и указатели

Сообщение VoidExp »

Точно :) Спасибо большое, перечитал пол-учебника по С++, но все-таки не нашел инфу... Проблема вроде решена. А как дело обстоит с операторами + / = ++i i++ и т.п?
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: [C++] Перегруженный operator[] и указатели

Сообщение sergio »

VoidExp писал(а):
24.10.2007 21:15
Точно :) Спасибо большое, перечитал пол-учебника по С++, но все-таки не нашел инфу... Проблема вроде решена. А как дело обстоит с операторами + / = ++i i++ и т.п?

Код: Выделить всё

int main()
{
    //Init
    MyClass* obj = new MyClass;
    int value = obj[7]; //etc...

    //Clean up
    delete obj;
    obj = NULL;
    return 0;
}


С операторами, как и с регулярными методами, дело одинаково обстоит. Вы ищете проблему не там, и отчего-то не видите где она сидит в полный рост.

Код: Выделить всё

{
  MyClass mc;
  int a = mc.at(3);
  int b = mc.operator [](3);
  int b = mc [3];
}
{
  MyClass* p_mc = new MyClass();
  int a = p_mc->at(3);
  int a = (* p_mc).at(3);
  int b = p_mc->operator [](3);
  int b = (* p_mc).operator [](3);
  int b = (* p_mc) [3];
}

Время для медитации пошло...
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12

Re: [C++] Перегруженный operator[] и указатели

Сообщение Assuri »

VoidExp писал(а):
24.10.2007 21:15
Точно :) Спасибо большое, перечитал пол-учебника по С++, но все-таки не нашел инфу... Проблема вроде решена. А как дело обстоит с операторами + / = ++i i++ и т.п?
Все это очень хорошо разъяснено в книжке "Объектно-ориентированное программирование на С++" Лафоре
Спасибо сказали:
Аватара пользователя
VoidExp
Сообщения: 208
Статус: Lead guitar adept
ОС: Ubuntu

Re: [C++] Перегруженный operator[] и указатели

Сообщение VoidExp »

Вот я как раз ее и читаю :) Но там сперва идут темы насчет перегрузки операторов, а потом уже про указатели... Так что комбинации юзанья указателей на объекты с перегруженными операторами вроде не описаны. В общем спасибо за разъяснение, работа над движком продолжается :)
Спасибо сказали:
Аватара пользователя
Atragor
Сообщения: 681
Статус: ...

Re: [C++] Перегруженный operator[] и указатели

Сообщение Atragor »

Что хоть за движок?
If you were MEANT to understand it, we wouldn't have called it 'code' © bash.org
Спасибо сказали:
Аватара пользователя
VoidExp
Сообщения: 208
Статус: Lead guitar adept
ОС: Ubuntu

Re: [C++] Перегруженный operator[] и указатели

Сообщение VoidExp »

Да пишу тут в свободное время игровой движок. Дизайн-лист более-менее такой:
Движок для 2D игр с выводом графики через OpenGL (для высокой производительности), с чистыми и понятным интерфесом. Звук через OpenAL, скриптовая система для Lua, мэнеджер сцены, ресурсов и управления... Все это в "минималистическом" стиле, то есть никакие там функциональности для специфических типов игр. Как прослойка между системой и движком используется SDL, потому-что думаю написать как кросс-платформенный. Из форматов думаю впаять поддержку BMP и PNG (для графики) и vorbis (как контейнер естественно ogg) для звука. В общем буду считать движок полноценным когда на нем будет возможно написать игры Тетрис, Понг, ПакМан и какое-то подобие бродилки вроде SuperTux.
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12

Re: [C++] Перегруженный operator[] и указатели

Сообщение Assuri »

VoidExp писал(а):
25.10.2007 23:23
Да пишу тут в свободное время игровой движок. Дизайн-лист более-менее такой:
Движок для 2D игр с выводом графики через OpenGL (для высокой производительности), с чистыми и понятным интерфесом. Звук через OpenAL, скриптовая система для Lua, мэнеджер сцены, ресурсов и управления... Все это в "минималистическом" стиле, то есть никакие там функциональности для специфических типов игр. Как прослойка между системой и движком используется SDL, потому-что думаю написать как кросс-платформенный. Из форматов думаю впаять поддержку BMP и PNG (для графики) и vorbis (как контейнер естественно ogg) для звука. В общем буду считать движок полноценным когда на нем будет возможно написать игры Тетрис, Понг
Сложно будет такое написать не зная указателей... А вообще удачи;)
Спасибо сказали:
Аватара пользователя
minoru-kun
Сообщения: 621
ОС: Debian GNU/Linux

Re: [C++] Перегруженный operator[] и указатели

Сообщение minoru-kun »

Указатели в CPP - негламурно :-/
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: [C++] Перегруженный operator[] и указатели

Сообщение Zeus »

А что - гламурно?
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: [C++] Перегруженный operator[] и указатели

Сообщение sergio »

Zeus писал(а):
26.10.2007 16:37
А что - гламурно?

VB.Net !!! (ржот)
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Аватара пользователя
VoidExp
Сообщения: 208
Статус: Lead guitar adept
ОС: Ubuntu

Re: [C++] Перегруженный operator[] и указатели

Сообщение VoidExp »

Ну, я не говорил что абсолютно незнаком с указателями! Просто раньше юзал обычные массивы и объекты, а теперь по техническим причинам нужны указатели.
Спасибо сказали:
Аватара пользователя
Atragor
Сообщения: 681
Статус: ...

Re: [C++] Перегруженный operator[] и указатели

Сообщение Atragor »

minoru-kun писал(а):
26.10.2007 13:01
Указатели в CPP - негламурно :-/


CPP - негламурно, даешь ассемблер!!!
If you were MEANT to understand it, we wouldn't have called it 'code' © bash.org
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: [C++] Перегруженный operator[] и указатели

Сообщение drBatty »

-DooM- писал(а):
24.10.2007 21:11
Это и так одно и то же ;) По крайней мере так Лафоре говорит.

это не одно и тоже. Например можно сделать указатель на указатель, массив указателей и указатель на массив. Но как сделать массив массивов? Массив, это просто место в памяти для нескольких одинаковых элементов, можно узнать сколько их(sizeof(m)/sizeof(m[0])). В массиве есть хотябы один элемент, указатель может указавать на что угодно, в т.ч. и на NULL. В функцию нельзя передать массив(например попробуйте передать, и внутри вычислить размер - получилось?)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: