C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Про области видимости и классы-функции
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;
};

Вернуться в Вопросы программирования в C++Builder