C++ 3d.Комментарии


Массивы


Не существует способа явного указания аргументов конструктора (за исключением использования списка инициализации) при объявлении массива.

К счастью, это ограничение можно сравнительно легко обойти. Например, посредством введения локального класса: #include <stdio.h>

struct A { // исходный класс int a; A(int a_) : a(a_) { printf("%d\n",a); } };

void f() { static int vals[]={2, 0, 0, 4}; static int curr=0;

struct A_local : public A { // вспомогательный локальный A_local() : A(vals[curr++]) { } };

A_local arr[4]; // и далее используем как A arr[4]; }

int main() { f(); }

Т.к. локальные классы и их использование остались за рамками книги, далее приводится соответствующий раздел стандарта:

9.8 Объявления локальных классов [class.local]

  1. Класс может быть определен внутри функции; такой класс называется локальным (local) классом. Имя локального класса является локальным в окружающем контексте (enclosing scope). Локальный класс находится в окружающем контексте и имеет тот же доступ к именам вне функции, что и у самой функции. Объявления в локальном классе могут использовать только имена типов, статические переменные, extern переменные и функции, перечисления из окружающего контекста. Например: int x; void f() { static int s; int x; extern int g();

    struct local { int g() { return x; } // ошибка, auto x int h() { return s; } // OK int k() { return ::x; } // OK int l() { return g(); } // OK }; // ... }

    local* p = 0; // ошибка: нет local в текущем контексте

  • Окружающая функция никаких специальных прав доступа к членам локального класса не имеет, она подчиняется обычным правилам (см. раздел 11 [class.access]). Функции-члены локального класса, если они вообще есть, должны быть определены внутри определения класса.

  • Вложенный класс Y может быть объявлен внутри локального класса X и определен внутри определения класса X или же за его пределами, но в том же контексте (scope), что и класс X. Вложенный класс локального класса сам является локальным.

  • Локальный класс не может иметь статических данных-членов.




  • Начало  Назад  Вперед



    Книжный магазин