C++

Предварительное обьявление класса(forward declaration)

В строго типизированных языках нельзя использовать имя сущности до ее обьявления(при компиляции создается таблица символов, которая заполняется сверху вниз и использование неопределенного символа ведет к ошибке компиляции). Что же делать когда, например, надо определить рекурсивную связь между классами?


class C1 {
C2 *c2;
};

class C2 {
C1 *c2;
};

Как их не располагай а все равно один из будет использован до его обьявления. Для таких целей и существуе предварительное обьявление класса. То есть, перед этим кодом просто надо поставить строчку

class C2;

которая говорит компилятору, что C2 является классом и будет определен где-то ниже. Но до определения нельзя писать конструкции, которым необходим размер класса – компилятор же его пока не знает. То есть код, написанный ниже скомпилирован не будет:


class C2;
void C2Action(C2 c);

поскольку для передачи параметра по значению компилятору нужен размер обьекта, для выделения в стеке блока соответствующего размера(В случае передачи параметра по ссылке размер не нужен, так как передается лишь указатель, который для всех типов имеет фиксированный размер, зависящий от архитектуры машины, на которой выполняется приложение).

Recently: