Включая заголовки только для личных данных в файле .h - PullRequest
3 голосов
/ 26 июля 2011

У меня есть класс, определенный в class.cpp и class.h.Класс использует некоторые структуры / классы / типы / все, что определено в stuff.h (и, конечно, stuff.cpp) для закрытых членов и методов.Моя основная программа в main.cpp, что #include s class.h, но ничего не значит в stuff.h.Если это имеет значение, class.cp должен загружаться динамически (.dll / .so).
В идеале я бы хотел, чтобы stuff.h включался только в class.cpp и stuff.cpp, связанные только с этимфайл, так как они могут вызвать загрязнение пространства имен в main.cpp и лишний раздув, будучи связанными с конечной программой.
Проблема в том, что мне нужно включить stuff.h в class.h, так как используются его определенияв private: части моего класса, который все в class.h.И так как main.cpp приносит class.h, он также получает stuff.h!

Надеюсь, это было ясно.В C # это может быть решено частичными классами.Как бы я сделал это в C ++?

Ответы [ 2 ]

2 голосов
/ 26 июля 2011

Вы делаете это в C ++, используя pImpl aka Opaque Pointers , где у класса, который вы выставляете, есть только один атрибут, который является частично определенной структурой (иногда вместо этого люди используют void *, но с тем же эффектом).

Частично определенная структура, затем полностью определенная внутри вашего stuff.cpp, и все работает так, как вы ожидаете - единственная загвоздка в том, что вам нужно убедиться, что вы конструируете и разрушаете новые / удаляете внутреннюю реализацию, и вам нужно чтобы сделать специальные положения в вашем конструкторе копирования и вашем операторе присваивания operator= - большинство людей выбирают просто сделать констант копирования и операторы присваивания частными, чтобы компилятор возражал, если они используются.

0 голосов
/ 26 июля 2011

Похоже, вам нужно Pimpl Idiom здесь. Основная идея Pimpl заключается в том, что вы пересылаете объявление класса с реализацией, а не включаете его определение. Это позволяет удалить зависимости от реализации в заголовочных файлах, что обычно приводит к ускорению компиляции, особенно в больших проектах.

...