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

К>Здравствуйте, 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
К>



// Операции с указателем
RL>>T& operator*() { assert(m_pI != NULL); return *m_pI; }
Я ни как не вразумею, — как нужно читать синтаксис этого оператора.

Мне понятна запись:

С operator + (const C lPar, const C rPar);


Читаю (в соответствии с тем как Вы меня учили)
Внешний оператор;
двухместный инфиксный оператор (операнд слева — lPar, операнд справа — rPar);

Возможны две формы вызова
явная:

C x,y,z;

z = +(x,y);

и операторная:

С x,y,z;

z = x+y;

Верно?

Теперь оператор-член класса:


 class С
{
  C add(val1, val2);
  C operator + (C rPar) const {return add(*this, rPar);}
};


Оператор-член класса; (подразумевается, что если левый аргумент не указан то это всегда *this)
двухместный (бинарный) и вроде бы инфиксный;

Явная форма вызова:

С obj;
C anyPar;
C res;
res = obj.operator + (anyPar); //равносильно obj+anyPar? Т.е текущий объект складывается с параметром, и что будет блин не догоняю ((

Операторная форма:

С obj;
C anyPar;
C res;

res = +anyPar;// правый операднд (параметр) указан явно, а левый есть объект. Какой??? anyPar-объект, а тот что в операторе где????


Мне бы хотелось в такой же форме разобрать и эти операторы:


 class cPtr
{
   private:
   T* p;//указатель на искомый интерфейс
   public:
   operator T*() {  return m_pI; }
   T& operator*() { return *m_pI; }
   T** operator&() { return &m_pI; }
   T* operator->() { return m_pI; }
};


Прошу извинить если надоедаю
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.