hKarel |
Отправлено: 25.08.2005, 12:53 |
|
Не зарегистрирован
|
Как известно С++ не поддерживает вложенные ф-ции, однако, нередко возникают ситуации когда наличие последних было бы совсем не лишним. Например, когда ф-я имеет несколько точек выхода, и перед выходом нужно выполнить некоторую последовательность действий. К счастью существуют обходные пути, которые позволяют хотя бы частично решить эту проблему. Почему частично? Чтобы это понять рассмотрим код:
CODE |
class A
{
private:
int f1();
public:
int f2();
int f3();
};
int A::f3()
{
// Описываем локальный класс-функцию
class TFunc
{
A *const a;
public:
TFunc( A *a_ ) : a( a_ ){}
int operator ()()
{
a->f2(); // Здесь все хорошо, можем
// обратиться к ф-ции f2
a->f1(); // А в этом месте возникают проблемы.
// Компилятор пишет, что ф-я f1 недоступна
// в области видимости класса TFunc.
return 0;
}
} func( this );
...
return func();
...
return func();
}
|
Собственно, вопрос заключается в том, как разрешить проблему видимости, при условии, что f1 должна оставаться private, либо protected ?
|
|
olegenty |
Отправлено: 25.08.2005, 14:03 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
подружить. хотя лучше подумать и переделать так, чтобы обращение к закрытому члену не понадобилось.
|
|
Георгий |
Отправлено: 25.08.2005, 20:56 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
изврат какой-то.
это плохо спроектированный класс.
функция "которая имеет несколько точек выхода" и должна "выполнять некие пост действия" решается как функция "обёртка" + функция "исполнитель"CODE | void Wrapper(...)
{
PreAction(...);
Executor(...);
Postaction(...);
};
void Executor(...){
if (...) return;
...
if(...) return;
...
return;
}; | |
|
|