Массивы
Не существует способа явного указания аргументов конструктора (за исключением использования списка инициализации) при объявлении массива.
К счастью, это ограничение можно сравнительно легко обойти. Например, посредством введения локального класса: #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]
Класс может быть определен внутри функции; такой класс называется локальным (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. Вложенный класс локального класса сам является локальным.
Локальный класс не может иметь статических данных-членов.