代码之家  ›  专栏  ›  技术社区  ›  Tim Rupe

在C++中向前声明一个类的公共Type

  •  9
  • Tim Rupe  · 技术社区  · 17 年前

    我试图通过使用前向声明并将include移动到实现文件中来简化一组头文件“include spaghetti”。但是,我不断地遇到以下情况:

    //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;
    };
    

    我想在尽可能多的情况下删除包括“bar.h”。我还看到了bar.h中typedef列在bar类之外的情况。我假设这两种情况都可以用同样的方式解决。

    有什么想法吗?

    2 回复  |  直到 9 年前
        1
  •  8
  •   Matthew Woo Hans Passant    9 年前

    不幸的是,你没有太多的选择,没有一个是完美的。

    首先,两个明显和不可接受的解决方案:

    • 您可以转发声明 typedef 完全破坏了使用 类型定义 .
    • 包括包含 类型定义 你要避免的。

    更有趣的解决方案:

    • 所有相关的 类型定义 包含在同一文件中。但这会在类之间创建代码耦合。您应该只对相关类执行此操作,否则将以一个包含上帝的文件结束,这可能会导致在添加 类型定义 到那个文件。
    • 对于每个类,都有一个单独的包含 类型定义 在里面。有点烦人,但它起作用。

    后两个类似于进行前向声明,但添加了 类型定义 因为很少修改typedef文件,所以它们减少了文件依赖性。

    我想说,在大多数情况下,中央包最有利于麻烦。小心点。

        2
  •  -2
  •   Charlie Martin    17 年前

    只使用 class Bar; . 它告诉C++你声明了定义BAR的意图。

    推荐文章