2012-05-06 3 views
5

Я довольно ясно понимаю, когда я могу/не могу использовать форвардную декларацию, но я все еще не уверен в одном.Передовая декларация/когда лучше включать заголовки?

Скажем, я знаю, что я должен включать в себя заголовок, рано или поздно разыменовываются объект класса А. Я не ясно, является ли это более эффективно делать что-то вроде ..

class A; 
class B 
{ 
    A* a; 
    void DoSomethingWithA(); 
}; 

, а затем в CPP есть что-то вроде ..

#include "A.hpp" 
void B::DoSomethingWithA() 
{ 
    a->FunctionOfA(); 
} 

Или может я, а просто включить заголовок в в файле заголовка B в первую очередь? Если первый более эффективен, я был бы признателен, если бы кто-то четко объяснил, почему, поскольку я подозреваю, что это имеет какое-то отношение к процессу компиляции, который я всегда мог бы сделать, узнав больше.

ответ

11

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

Вот обоснование Google на этом: Header File Dependencies

+0

+1 для Google C++ Style Guide – LihO

+0

приветствий для ответа, и стиль Googles руководство выглядит как это будет больше читать спасибо! – Holly

+8

Я знаю, что эта ветка устарела, но я думаю, что я должен указать, на всякий случай, если кто-то еще ищет логическое обоснование, что обоснование Google, похоже, изменилось на «Избегайте использования форвардных объявлений там, где это возможно». Просто # включите нужные заголовки. " – soulsabr

0

Не пытайтесь составить компиляция эффективная. Там есть драконы. Просто включите A.hpp в B.hpp.

Стандартная практика для заголовочных файлов С и С ++, чтобы обернуть все заголовочный файл в #ifdef, чтобы убедиться, что он составлен только один раз:

#ifdef _A_HPP_ 
#define _A_HPP_ 

// all your definitions 

#endif 

Таким образом, если вы #include "A.hpp" в B.hpp, вы можете иметь программу, которая включает в себя и то и другое, и она не сломается, потому что она не будет пытаться что-то определить дважды.

4

Когда вы используете форвардное объявление, вы явно говорите с ним «класс B не должен ничего знать о внутренней реализации класса A, ему нужно только знать, что класс с именем A существует». Если вы не можете включить этот заголовок, то избегайте его. - рекомендуется использовать форвардную декларацию вместо этого, потому что вы устраняете избыточные зависимости, используя ее.

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

Эти вопросы также помогут вам:
What are the drawbacks of forward declaration?
What is the purpose of forward declaration?

Смежные вопросы