Форвардное объявление в нескольких исходных каталогах;создание экземпляра шаблона

StackOverflow https://stackoverflow.com/questions/1172281

Вопрос

Я ищу хорошую книгу, справочный материал, посвященный форвардному объявлению классов, особенно.когда источники находятся в нескольких каталогах, например.класс A в dirA заранее объявлен в классе B в dirB?Как это делается?

Кроме того, очень приветствуются любые материалы по вопросам шаблонов, расширенному использованию и проблемам создания экземпляров?

Спасибо.

Это было полезно?

Решение

Предварительные объявления не имеют ничего общего со структурой каталогов вашего проекта.Вы можете объявить что-то, даже не существующее в вашем проекте.Они в основном используются для разрешения циклических ссылок между классами и для ускорения компиляции, когда полное объявление класса не требуется, а соответствующий #include можно заменить прямым объявлением.

Чтобы определить, достаточно ли предварительного объявления, запрос sizeof() обычно может ответить на вопрос.Например,

class Wheel;

class Car
{
    Wheel wheels[4];
};

В этом объявлении нельзя использовать предварительное объявление, поскольку компилятор не может определить размер автомобиля:он не знает, сколько данных содержат колеса.Другими словами, sizeof(Car) неизвестно.

Также что касается шаблонов, классы, объявленные заранее, не могут использоваться в качестве параметров шаблона, если класс шаблона содержит элементы данных параметра шаблона (но их указатели могут быть).Например,

template<class T> class pointer
{
    T *ptr;
};

class Test;
pointer<Test> testpointer;

законно, но

std::vector<Test> testvector не скомпилируется.

Из-за вышеупомянутых ограничений заранее объявленные классы обычно используются как указатели или ссылки.

Не знаю, есть ли книга на эту тему, но вы можете посмотреть. эта секция на часто задаваемых вопросах по C++ Lite.

Другие советы

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

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

если они находятся в параллельных каталогах, вы можете включить их как

#include "../dirB/B.h"

но в заголовке вы просто вызываете эту строку для прямого замедления

class B;

вместо этого вы можете разделить каталоги включения и каталоги исходников.

поэтому вы можете показать каталог включения как этот каталог и добавить заголовок, вызвав

#include "dirB/B.h"

поскольку вы сделаете прямое объявление в заголовке, это не будет проблемой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top