Форвардное объявление в нескольких исходных каталогах;создание экземпляра шаблона
-
19-09-2019 - |
Вопрос
Я ищу хорошую книгу, справочный материал, посвященный форвардному объявлению классов, особенно.когда источники находятся в нескольких каталогах, например.класс 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"
поскольку вы сделаете прямое объявление в заголовке, это не будет проблемой.