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

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


class C1 {
C2 *c2;
};

class C2 {
C1 *c2;
};

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

class C2;

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


class C2;
void C2Action(C2 c);

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



Digital Ocean
Провайдер облачного хостинга - заведи свой виртуальный сервер всего за $5 в месяц !

5 Comments

  1. Vladvic

    Есть еще один камень подводный С++, как раз на него я недавно и наткнулся 🙂


    CMyClass
    {
    public:
    bool foo;
    CMyClass(int a) { ... };
    CMyClass(bool b) { foo = b; CMyClass(); };
    ...
    }

    Догадайтесь почему по второму конструктору объект не инициализировался по-человечески 🙂
    Догадались? А я долго думал 🙂

  2. nashaistiuldev

    Новинка!
    Специальное предложение!
    Уникальный Фитнес для беременных в Москве.

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

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

    Курсы для беременных в Москве проводятся летом каждый вторник, с 17.00 до 18.30.

    Приглашаем на курсы будущих мам и пап! Присоединяйтесь! Запись по телефону: 8-903-767-767-5

  3. autiuldev

    Продаем популярный и качественный пульт дистанционного управления краном и пульты дистанционного управления складской техникой популярной фирмы Аутек.

    Пульт дистанционного управления краном способен управлять подъемным краном – кран-балка, кран мостовой, кран козловой, кран консольный в очень удобном для крановщика режиме.

    Пульты управления краном Аутек подходят не только для кранов козловых, но и для радиоуправления автокраном, а так же складской и крановой техникой.

  4. Develop

    Инвестиционно строительная компания ТОРИСС проектирование и строительство всех видов зданий и сооружений в РФ, капитальное строительство и реконструкция, производство строительно-монтажных, ремонтно-строительных работ.

Leave a Reply