Прямое объявление открытого typedef класса в c ++
-
08-07-2019 - |
Вопрос
Я пытаюсь упростить набор заголовочных файлов "include spaghetti", используя прямые объявления и перемещая #includes в файл реализации.Тем не менее, я продолжаю наталкиваться на следующий сценарий:
//Foo.h
#include "Bar.h"
class Foo
{
public:
void someMethod(Bar::someType_t &val);
};
//Bar.h
.
.
.
class Bar
{
public:
typedef std::vector<SomeClass> someType_t;
};
Я хочу удалить #include "Bar.h" в как можно большем количестве случаев.Я также вижу ситуацию, когда typedef в Bar.h указан вне класса Bar.Я предполагаю, что обе ситуации можно решить одним и тем же способом.
Есть какие-нибудь идеи?
Решение
К сожалению, у вас не так уж много вариантов, и ни один из них не идеален.
Во-первых, два очевидных и неприемлемых решения:
- Вы можете переслать объявление о
typedef
что полностью противоречит цели использованияtypedef
. - Вы включаете файл, содержащий
typedef
, чего вы хотите избежать.
Более интересные решения:
- Есть все связанные
typedef
s в том же include и включите этот файл.Однако это создает связь кода между классами.Вы должны делать это только со связанными классами, иначе в итоге вы получите файл god include, и это может привести к большой перекомпиляции при добавленииtypedef
к этому файлу. - Для каждого класса имейте отдельный include с
typedef
s в нем.Немного раздражает, но это работает.
Эти последние два похожи на выполнение прямых объявлений, но с добавлением typedef
s.Они уменьшают взаимозависимость файлов, поскольку вы редко изменяете файл typedef.
Я бы сказал, что для большинства ситуаций центральное включение имеет наибольшую выгоду в плане хлопот.Просто будь осторожен.
Другие советы
Просто используйте class Bar;
. Это говорит C ++, что вы заявляете о своем намерении определить Bar. Р>