Re[18]: Перегрузка операторов
От: Кодт Россия  
Дата: 25.05.04 11:20
Оценка:
Здравствуйте, Red Line, Вы писали:

RL>Меня тормозят следующие моменты:


Рассмотрим интерфейс ISome и смарт-птр к нему, CComPtr<ISome> == CSomePtr;

RL>// Преобразование
RL>operator T*() { return m_pI; }

CSomePtr ptr;
void foo(ISome* p);

ISome* p = ptr;
foo(ptr);

RL>// Операции с указателем
RL>T& operator*() { assert(m_pI != NULL); return *m_pI; }

// эквивалентные способы вызвать метод: оператор-> и разыменовать...
((ISome*)ptr)->method();
(*((ISome*)ptr)).method();
(*ptr).method();

RL>T** operator&() { assert(m_pI == NULL); return &m_pI; }-------- > только этот понятен

// Кстати, довольно зловредный оператор. В ряде случаев мешает.
// Лучше уж ввести в CSomePtr метод reference(), возвращающий ссылку на переменную-член

RL>T* operator->() { assert(m_pI != NULL); return m_pI; }

// оператор доступа
((ISome*)ptr)->method();
ptr->method();

Оператор -> — занятная фича языка С++. В выражении obj->member выполняется следующее:
result_of_arrow_1 t1 = obj.operator->();
// если result_of_arrow_1 - не указатель, то
result_of_arrow_2 t2 = t1.operator->();
// если опять не указатель, то
result_of_arrow_3 t3 = t2.operator->();
...
// наконец, tN - это указатель
(*tN).member
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.