在类或外部声明的typedef结构?

时间:2012-04-13 16:12:20

标签: c++ visual-c++

我正在创建一个名为ImageLoader的类,它将用于加载各种图像格式。对于各种图像格式,使用某些结构。例如,对于bmp文件,您有一个BITMAPFILEHEADER结构和另外两个结构。

我想知道的是,当我将我的类定义放在头文件中时,我是否要将类typedefs作为类定义的一部分,还是应该在类定义之外将它们分开?

我不确定因为如果我只是声明一个结构变量,这显然会在类中发生,但因为我正在定义一个类型,我不确定它是否被认为是一个好的设计来定义一个类型里面一堂课。

6 个答案:

答案 0 :(得分:6)

我的一般规则是,如果它只与该类一起使用,那么在里面声明它(它意味着所有权);否则单独声明。

答案 1 :(得分:3)

如果你从标题中遗漏了所有内容,你会得到更好的封装。即使你的类的某些方法需要参数或返回结构类型,你也可能会使用前向声明。

需要将它放在标题中的唯一时间是它是公共界面的一部分。

关于它是否进入课堂,考虑它是否有用,或者它是否完全服从于课堂。如果它可以独立存在,它可能应该放在自己的标题中。

答案 2 :(得分:3)

我不会说在类中声明类型是设计错误的指标。假设你提到的“设计”意味着“可读性”,我会坚持一致,并坚持以同样的方式表达相同的关系。

否则,你不会因为嵌套类型的神圣愤怒而被击倒(考虑到SGI不是一个闷烧的陨石坑)。这是以环境为中心的,因此除了根据您的要求定义的内容之外,没有严格的规则。

如果客户端可访问性不是问题,我将大多数所有内容都声明在标题中的适当范围内,并记录我的代码的含义。同样,如果我没有严格的使用/可读性指南来强制执行。如果我这样做的话,我会选择马克的建议。

两分钱:您可以尝试枚举图像类型并使用一个公共结构来获取配置数据,这样您就可以证明其他所有其他功能都是闭门造车的。

答案 3 :(得分:1)

BITMAPFILEHEADER是Win32 Platform SDK中定义的结构。我不确定我是否理解你的要求以及你的班级......

通常,如果要定义未向类客户端公开的结构,我会在类的私有部分或头文件中的子命名空间Details中定义它们。 ,例如:

namespace YourCoolLibrary
{
  namespace Details
  {
    struct SomeInternalStructure
    {
      ...
    };

  } // namespace Details


  class YourCoolClass
  {
    ...
  private:
    Details::SomeInternalStructure m_something;
  };

} // namespace YourCoolLibrary

答案 4 :(得分:1)

甚至还有更多选择。如果你把它放在类中,你必须选择它是公共的,保护的还是私有的,使类定义对于类的每个用户都可见,只有派生类或没有其他类。

如果您不需要类定义的详细信息,我只会将前向声明放入ImageLoader以使其更简单。然后内部类的完整定义将进入实现文件。

我的经验法则是尽可能将名称设置为本地名称,因此如果我在错误的位置意外使用它,编译器会抱怨。

答案 5 :(得分:0)

如果typedef在逻辑上属于您正在创建的类,请将其放入;如果它在全球范围内有意义,请将其留在外面。