Включение заголовочных файлов / Предописание

В моем проекте C++, когда, я должен использовать включение (#include "myclass.h") из заголовочных файлов? И когда делают я должен использовать предописание класса (class CMyClass;)?

13
задан Andrew Barber 13 January 2012 в 18:58
поделиться

4 ответа

Как правило, сначала попробуйте предварительное объявление. Это сократит время компиляции и т. Д. Если это не компилируется, используйте #include . Вы должны использовать #include, если вам нужно выполнить одно из следующих действий:

  1. Доступ к члену или функции класса.
  2. Использовать арифметику указателей.
  3. Используйте sizeof.
  4. Любая информация RTTI.
  5. новое / удалить , скопировать и т. Д.
  6. Использовать по значению.
  7. Наследовать от него.
  8. Имейте это как член.
  9. Экземпляр функции.

(6,7,8,9 от @Mooing Duck)

Их, наверное, больше, но у меня сегодня нет шляпы по языковому праву.

21
ответ дан 1 December 2019 в 17:45
поделиться

Вам следует стремиться к минимизации ваших #include как для сокращения времени компиляции, так и для обеспечения модульности и тестируемости. Как говорит @ypnos, переадресация классов отлично подходит, когда вам нужны только указатели.

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

3
ответ дан 1 December 2019 в 17:45
поделиться

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

11
ответ дан 1 December 2019 в 17:45
поделиться

Как новичок, вы всегда должны #include заголовочные файлы, когда вам нужно использовать типы или функции, которые они содержат - не пытайтесь "оптимизировать" вашу сборку, объявляя все заранее - это почти никогда не нужно, даже в больших проектах, если проект хорошо спроектирован.

Единственный раз, когда вам абсолютно необходимо прямое объявление, это в ситуациях, подобных этой:

struct A {
   void f( B b );
};

struct B {
   void f( A a );
};

когда каждая структура (или класс) ссылается на тип другой. В этом случае вам нужно прямое объявление B, чтобы решить проблему:

struct B;   // forward declaration

struct A {
   void f( B b );
};

struct B {
   void f( A a );
};
2
ответ дан 1 December 2019 в 17:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: