Форвард объявить открытый typedef класса в C ++ - PullRequest
9 голосов
/ 07 мая 2009

Я пытаюсь упростить набор заголовочных файлов "include spaghetti", используя предварительные объявления и перемещая #include в файл реализации. Тем не менее, я продолжаю сталкиваться со следующим сценарием:

//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. Я предполагаю, что обе ситуации могут быть рассмотрены одинаково.

Есть идеи?

Ответы [ 2 ]

8 голосов
/ 07 мая 2009

К сожалению, у вас не так много вариантов, и ни один не идеален.

Во-первых, два очевидных и неприемлемых решения:

  • Вы можете объявить typedef, что полностью отрицает цель использования typedef.
  • Вы включаете файл, содержащий typedef, которого вы хотите избежать.

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

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

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

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

0 голосов
/ 07 мая 2009

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

...