Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Pointer to reference in [] operator


Автор: RomanEEP 3.10.2012, 12:51
У меня объявлена переменная такого template класса:
Код

RPArray<MbContour>* m_contourList;

Внутри класса RPArray объявлен оператор
Код

  /// Оператор доступа по индексу.
  Type *&       operator []( size_t loc ) const { 
    PRECONDITION( loc < count ); return parr[loc]; }

Как мне получить указать на, к примеру, 1 элемент этого списка?

Я делаю так:
Код

MbContour * Cont = m_contourList[0];

и получаю ошибку: error C2440: 'initializing' : cannot convert from 'RPArray<Type>' to 'MbContour *

Автор: bsa 3.10.2012, 13:15
RomanEEP, во-первых, когда ты определил указатель m_contourList на RPArray<MbContour>, то компилятор сразу тебе сделал стандартный оператор []. Думаю, тебе для начала нужно определять не указатель, а объект класса RPArray<MbContour*> (обрати внимание, где находится звездочка - это важно).
во-вторых, твой оператор [] возвращает ссылку на указатель. Скорее всего это неправильно, так как кто-то сможет случайно подпортить этот указатель.

Автор: RomanEEP 3.10.2012, 13:20
Цитата(bsa @  3.10.2012,  13:15 Найти цитируемый пост)
во-вторых, твой оператор [] возвращает ссылку на указатель. Скорее всего это неправильно, так как кто-то сможет случайно подпортить этот указатель.

Дело в том что этот класс и соответственно все его операторы находятся внутри сторонней библиотеки, которые, видимо, сделали это в связи с какой-то необходимостью

Автор: math64 3.10.2012, 13:32
Просто поленились писать два оператора [] :  Type *& operator []( size_t loc ) и Type * operator []( size_t loc ) const

Автор: RomanEEP 3.10.2012, 14:52
ясно. Так есть возможность получить указатель из списка если объявить его так: RPArray<MbContour*>
я его объявил так и тем не менее конструкция 
Код

MbContour * Cont = m_contourList[0];

выдает ту же ошибку

Автор: math64 4.10.2012, 08:21
Там * не нужна, т.е. RPArray<MbContour>. RPArray всегда хранит только указатели.

Автор: RomanEEP 4.10.2012, 10:54
ясно. тогда как мне к этому RPArray обратиться чтобы получить этот указатель?

Автор: Result 4.10.2012, 21:29
Разыменовывай указатель, применяй оператор [].

Код

   Some<int>* m_contourList = new Some<int>(); 
   //...
   int* cont1 = (*m_contourList)[0];


http://liveworkspace.org/code/c0505bbe5ee1b530f603ad25e58c8ab4

ЗЫ. В примере для простоты отсутствуют проверки, управление памятью и тд.

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