Ваш первый пункт натолкнул на некоторые сумасбродные мысли и даже заставил сесть за компилятор
Если бы можно было делать так, то было бы вполне приемлемо
Код: Выделить всё
class A
{
int f1(){ return 0; }
friend class TFunc;
class TFunc
{
A *const a;
public:
TFunc( A *a_ ) : a( a_ ){}
int operator()();
};
public:
int f2(){ return 0; }
int f3();
int f4();
};
//---------------------------------------------------------------------------
A::f3()
{
int TFunc::operator()()
{
// реализация специфичная для ф-ции f3
}
TFunc func( this );
}
//---------------------------------------------------------------------------
A::f4()
{
int TFunc::operator()()
{
// реализация специфичная для ф-ции f4
}
TFunc func( this );
}
Однако все оказалось гораздо прозаичнее, компилятор (борландовый) допускает только конструкции вида:
Код: Выделить всё
class A
{
int f1(){ return 0; }
friend class TFunc;
class TFunc
{
A *const a;
public:
TFunc( A *a_ ) : a( a_ ){}
int operator()();
};
public:
int f2(){ return 0; }
int f3();
int f4();
};
//---------------------------------------------------------------------------
int A::TFunc::operator()()
{
...
}
//---------------------------------------------------------------------------
A::f3()
{
TFunc func( this );
}
//---------------------------------------------------------------------------
A::f4()
{
TFunc func( this );
}
А это значит, что для каждой ф-ции класса А надо будет писать свою ф-цию TFunc - чего бы не хотелось. Кстати, ребятм с RSDN удалось скомпилить исходный пример на нескольких компиляторах, включая MS VC7.1, единственно открытым остался вопрос: "Насколько компиляция исходного примера соответствует стандарту ?".
По второму пункту: принципиально не хочу сейчас обсуждать правила хорошего проектирования процедур, но в жизни случается нак, что код процедуры может занимать не одну сотню строк. В такой ситуации границы конструкции do-while плохо просматриваемы, поэтому я предпочел бы все таки goto.
Сложность - это мера непонимания.