перегрузка оператора -> (стрелка :) )
От: мухоморец Украина  
Дата: 25.10.07 09:13
Оценка:
не могу вспомнить соотвественно и подобрать пример
вроде есть правило принципа вызова ->
раскрутка для внутренних обьектов

вопрос, какие есть нюансы для перегруженного оператора->

искал , но не нашёл
Re: перегрузка оператора -> (стрелка :) )
От: Lorenzo_LAMAS  
Дата: 25.10.07 09:18
Оценка: 3 (1)
Здравствуйте, мухоморец, Вы писали:

М>не могу вспомнить соотвественно и подобрать пример

М>вроде есть правило принципа вызова ->
М>раскрутка для внутренних обьектов

Если он вернет указатель, либо объект, для типа которого так же перегружен оператор ->,
то:

struct A
{
  int i_;
};

class B
{
public:
   A * operator ->();
};

class C
{
public:
   B operator ->();
};

int main()
{
  C c;
  c->i_ = 0;
}


М>вопрос, какие есть нюансы для перегруженного оператора->

Может вернуть и что-то еще кроме перечисленного, просто тогда не будет применяться "раскрутка для внутренних обьектов "
М>искал , но не нашёл
Of course, the code must be complete enough to compile and link.
Re: перегрузка оператора -> (стрелка :) )
От: VoidEx  
Дата: 25.10.07 09:22
Оценка: 10 (3)
Здравствуйте, мухоморец, Вы писали:

М>не могу вспомнить соотвественно и подобрать пример

М>вроде есть правило принципа вызова ->
М>раскрутка для внутренних обьектов

М>вопрос, какие есть нюансы для перегруженного оператора->


М>искал , но не нашёл


#include <iostream>

class MyClass;

class Test
{
    MyClass * m;
public:
    Test(MyClass * M) : m(M) {}
    MyClass * operator -> () { std::cout << "Test -> "; return m; }
};

class MyClass
{
public:
    Test operator -> () { std::cout << "MyClass -> "; return Test(this); }
    void print () { std::cout << "print"; }
};

int main()
{
  MyClass m;
  m->print();
}


Вывод:
Test -> MyClass -> print

Т.е. operator -> применяет -> к возвращаемому значению. Если возвращен указатель, то просто обратимся к его членам, а если объект (Test), то опять вызовется operator ->
Re: перегрузка оператора -> (стрелка :) )
От: Кодт Россия  
Дата: 25.10.07 18:26
Оценка: 4 (2)
Здравствуйте, мухоморец, Вы писали:

Кстати, иногда это применяется для обрамления доступа
class Temp
{
    Native* m_ptr;
public:
    Temp(Native* ptr) : m_ptr(ptr) { DoLeading1(); }
    Native* operator->() const { DoLeading2(); return m_ptr; }
    ~Temp() { DoTrailing(); } // иным способом это не сделать без дополнительных усилий
};

class LongLife
{
    .....
public:
    Temp operator->() { return Temp(m_ptr); }
};

Примерно так.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!