Язык C ++ не различает код в заголовочных файлах и других файлах.Он даже не требует, чтобы заголовок был файлом.Так что чисто технически вопрос бессмыслен, но на практике вы ограничиваете то, что делаете в заголовочных файлах, чтобы не противоречить правилу единого определения.Не ограничивая себя, пользователи должны быть осторожны, чтобы включить заголовочный файл только в одну единицу перевода.С надлежащими ограничениями заголовочный файл может быть свободно включен в несколько единиц перевода.
неполный тип - это тот, где размер неизвестен, где sizeof
не может использоваться.
Когда определение класса неизвестно, класс Foo
обязательно является неполным.
Это означает, что вы не можете делать вещи, для которых требуется знать размер.А поскольку незавершенность означает, что члены не известны (они обязательно будут известны, если бы размер был известен), вы, как правило, не можете вызывать членов.Исключение: вы можете вызвать деструктор, как в delete pFoo
, и компилятор должен это принять, но это неопределенное поведение, если класс Foo
имеет нетривиальный деструктор.
исключение, отмеченное в правилах Google, однако, не имеет смысла.
РЕДАКТИРОВАТЬ : я обнаружил, что людям на SO нравится больше, когда все подробно описано, поэтому добавлю обсуждение почему указание не имеет смысла.
Указание говорит, что вы можете "объявить (но не определить)", но что "одно исключение - если аргумент Foo или const Foo & имеет неявный, однозначныйКонструктор аргумента ".
Объявление не имеет ничего общего с конструкторами, что можно подтвердить, просто попробовав его:
#include <iostream>
struct Foo;
Foo bar( Foo const& ); // Declaration of function bar, works fine.
struct Foo
{
int x_;
Foo( int x ): x_( x ) {} // Converting constructor.
};
int main()
{
std::cout << bar( 42 ).x_ << std::endl;
}
Foo bar( Foo const& foo ) { return foo; }
В заключение, опять же, исключение из правил Googleне имеет смысла.
Приветствия & hth.,