включая файлы .h - PullRequest
       2

включая файлы .h

2 голосов
/ 18 мая 2010

Предположим, у меня есть два файла .h: A.h и B.h. Более того, A.h включает в себя самого B.h:

B.h - определяет класс B.

class B {
  ...
};

A.h - определяет класс A, который использует класс B.

#include B.h

class A {
  void SomeFunction(const B& b);
};

Теперь у меня есть некоторый файл .cpp, который использует классы A и B (класс B может использоваться не только в A :: SomeFunction (B))

Каковы плюсы для включения как A.h, так и B.h (вместо только A.h) с точки зрения шаблонов проектирования и стиля кодирования.

Ответы [ 3 ]

6 голосов
/ 18 мая 2010

Включение обоих «A.h» и «B.h» делает зависимости полностью ясными. Нет никаких причин, по которым «A.h» не мог иметь объявленный в форвардном классе B, и поэтому включение обоих заголовков предотвращает разрыв вашего файла «.cpp», если переходное включение должно быть изменено на форвардное объявление. В общем случае не стоит полагаться на транзитивные включения, и вместо этого следует явно включать все прямые зависимости. (Обратите внимание, что это не относится к заголовкам «master include», которые предназначены для предоставления переходных включений).

3 голосов
/ 18 мая 2010

Это не имеет ничего общего с шаблонами проектирования. Вы должны включать Bh всякий раз, когда вам нужно использовать класс B, и включать Ah, когда вам нужно использовать класс A. Если класс B является конструктивной деталью класса A или иным образом тесно связан с ним, поместите его в Ah а не в отдельном заголовочном файле.

0 голосов
/ 18 мая 2010

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

Например:

хиджра:

#ifndef _A_H_
#define _A_H_

class A 
{
};

#endif

B.h:

#ifndef _B_H_
#define _B_H_

#include "a.h"

class B : public A
{
};

#endif

Я думаю, что вышеупомянутое имеет смысл, потому что теперь вы можете включать A и B столько раз, сколько вам нужно, но это не будет компилироваться несколько раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...