Вопрос:

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

Ответ:

Решение:

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

В коде используются следующие типы:

  • A и B (в объявлении класса X: public A, public B)
  • B (в параметре функции f(int, char*) и в параметре функции g(B))
  • C (в параметре функции f(int, C*))
  • E (в возвращаемом значении функции h(E))
  • D (в объявлении члена класса std::list<D> dlist_)
  • std::list (в объявлении члена класса std::list<D> dlist_)

Директива #include <list> (строка 7) подключает стандартный список C++. Без нее не будет работать std::list, поэтому ее убрать нельзя.

Теперь рассмотрим заголовочные файлы a.h, b.h, c.h, d.h, e.h:

  • Если a.h содержит объявление класса A, b.h — класса B, c.h — класса C, а d.h — класса D, то для корректной работы класса X они все необходимы.
  • e.h содержит объявление класса E. Класс E используется только в сигнатуре функции E* h(E){}. Если в e.h есть только объявление класса E (без его полного определения), то для использования указателя на E или возвращаемого значения типа E* достаточно предварительного объявления класса.

Предварительное объявление класса выглядит как class E;. Если заголовочный файл e.h содержит именно такое предварительное объявление, то его можно убрать, если другие файлы (например, a.h, b.h, c.h, d.h) предоставляют все необходимые определения для A, B, C, D.

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

Однако, если под 'объявлением' подразумевается предварительное объявление, то e.h можно убрать, если все остальные нужные классы (A, B, C, D) определены.

Исходя из предложенных вариантов ответа (//1, //3, //5, //4), они относятся к файлам a.h, c.h, e.h, d.h соответственно.

Учитывая, что E используется только для указателя и возвращаемого значения, его полное определение, вероятно, не требуется для определения класса X, если только E не является базовым классом или не содержит виртуальных функций, которые должны быть переопределены.

Если предположить, что a.h, b.h, c.h, d.h необходимы для определения A, B, C, D, а e.h содержит лишь объявление класса E (что достаточно для указателей), то #include "e.h" (//5) можно убрать.

Ответ: //5

Подать жалобу Правообладателю