Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, 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; }
};
Прошу извинить если надоедаю