Какова область внутренней структуры "struct Object"?
Область действия локальных классов - это функция, в которой они определены. Но это само по себе неинтересно.
Что делает локальные классы интересными, так это то, что , если реализуют некоторый интерфейс (как это делает ваш код), то вы можете создать его экземпляры (используя new
) и вернуть их (например, как std::vector<IBase*>
), что делает реализацию доступной через указатель базового класса даже вне функции.
Некоторые другие факты о местных классах:
Они не могут определять статические переменные-члены.
Они не могут получить доступ к нестатическим «автоматическим» локальным переменным функции включения. Но они могут получить доступ к static
переменным.
Они могут использоваться в функциях шаблона.
Если они определены внутри функции шаблона, то они могут использовать параметры шаблона функции включения.
Локальные классы являются окончательными, это означает, что пользователи вне функции не могут наследовать локальный класс от функции. Без локальных классов вам пришлось бы добавить безымянное пространство имен в отдельном модуле перевода.
Локальные классы используются для создания функций батута , обычно известных как thunks .
РЕДАКТИРОВАТЬ * * тысяча пятьдесят-одна
Некоторые ссылки из Стандарта (2003)
9.8 Локальные объявления классов [class.local]
\ 1. Класс может быть определен в определении функции; такой класс
называется местный класс. Наименование
локальный класс является локальным
объем. Локальный класс находится в области видимости
охватывающей области, и имеет
тот же доступ к именам за пределами
функционировать так же, как и ограждающие
функция. Объявления в местном
класс может использовать только имена типов, статические
переменные, внешние переменные и
функции и счетчики из
объем ограждения.
[Example:
int x;
void f()
{
static int s ;
int x;
extern int g();
struct local {
int g() { return x; } // error: x is auto
int h() { return s; } // OK
int k() { return ::x; } // OK
int l() { return g(); } // OK
};
// ...
}
local* p = 0; // error: local not in scope
—end example]
\ 2. Функция включения не имеет специального доступа к членам местного
учебный класс; подчиняется обычным правилам доступа
(пункт 11). Функции-члены
местный класс должен быть определен в пределах
их определение класса, если они
определены вообще.
\ 3. Если класс X является локальным классом, вложенный класс Y может быть объявлен в
класс X и позже определены в
определение класса X или позже
определяется в той же области, что и
определение класса X. Вложенный класс
внутри локального класса есть локальный класс.
\ 4. Локальный класс не должен иметь статических членов данных.