Вопрос

Я пытаюсь упростить набор заголовочных файлов "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, чего вы хотите избежать.

Более интересные решения:

  • Есть все связанные typedefs в том же include и включите этот файл.Однако это создает связь кода между классами.Вы должны делать это только со связанными классами, иначе в итоге вы получите файл god include, и это может привести к большой перекомпиляции при добавлении typedef к этому файлу.
  • Для каждого класса имейте отдельный include с typedefs в нем.Немного раздражает, но это работает.

Эти последние два похожи на выполнение прямых объявлений, но с добавлением typedefs.Они уменьшают взаимозависимость файлов, поскольку вы редко изменяете файл typedef.

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

Другие советы

Просто используйте class Bar; . Это говорит C ++, что вы заявляете о своем намерении определить Bar.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top