在哪里放置用户定义类型的容器?

时间:2009-10-31 02:26:07

标签: c++

考虑一个人有一些用户定义的类型,以及那些经常被操纵的类型的容器,因为这些类型通常一次出现在屏幕上。

目前我有一个带有关联源文件的头文件和一个用于保存这些容器的命名空间,但是我应该创建一个单独的类来保存它们吗?我应该将容器放在与它们包含的类相同的头文件中(但显然在类外)?这种情况的标准做法是什么?

1 个答案:

答案 0 :(得分:2)

每当特定类将容器作为该类接口的一部分时,我就会对它们进行typedef。然后,任何需要使用该类的人都很容易发现“FooVec”是Foo的std :: vector而没有很多fus。

但是,这是一个不完美的解决方案,请考虑以下代码:

namespace bar
{

  typedef std::vector<Foo> FooVec;

  class CClass
  {
      CClass(FooVec&)
      {
          ...
      }
  };
}

当你的同事为他们的班级重新定义FooVec时,自然会出现问题:

namespace bar
{

typedef std::vector<const Foo> FooVec;

class CAnotherClass
{
    CAnotherClass(FooVec&)
    {
        ...
    }
}

};

我发现解决这个问题的最简单方法是将它们放在每个命名空间/库/关联类组中的大约一个公共包含中。因此,当其他人在bar命名空间中添加typedef时,您可以将它们全部放在一个位置。 IE:

 barTypes.h

 namespace bar
 {
         typedef std::vector<Foo> FooVec;
         typedef std::vector<const Foo> FooConstVec;

 }

通过将每个小类(即每个命名空间)保持为一个标头,您不会得到一个充满typedef的巨大文件。它仍然可以让您的用户很好地了解作为类接口一部分的类型。一旦建立了这个标题,只需要维护团队的纪律,而不是建立额外的typedef。

如果您对构建性能感到厌倦,也可能希望将此标头作为precompiled header的一部分。