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

7b6e9298

Массивы


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

К счастью, это ограничение можно сравнительно легко обойти. Например, посредством введения локального класса: #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. Вложенный класс локального класса сам является локальным.

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



Содержание раздела