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

C++ 在类内部或外部声明的typedef结构?,c++,visual-c++,C++,Visual C++,我正在创建一个名为ImageLoader的类,用于加载各种图像格式。对于各种图像格式,使用了某些结构。例如,对于bmp文件,您有一个BITMAPFILEHEADER结构和两个其他结构 我想知道的是,当我把我的类定义放在头文件中时,我是将struct typedefs作为类定义的一部分,还是在类定义之外将它们分开 我不确定,因为如果我只是声明一个结构变量,这显然会发生在类中,但是因为我定义了一个类型,我不确定在类中定义一个类型是否被认为是好的设计;如果它在全局级别上有意义,就把它放在外部。我的一般

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

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


我不确定,因为如果我只是声明一个结构变量,这显然会发生在类中,但是因为我定义了一个类型,我不确定在类中定义一个类型是否被认为是好的设计;如果它在全局级别上有意义,就把它放在外部。

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

如果您尽可能省略标题中的所有内容,则可以获得更好的封装。即使类的某些方法需要结构的参数或返回类型,也可以使用前向声明

您唯一需要将它放在标题中的时间是当它是公共接口的一部分时

至于它是否在课堂上,考虑它本身是否有用,或者它是否完全服从课堂。如果它可以独立运行,它可能会放在自己的头中。

是Win32 Platform SDK中定义的结构。我不确定我是否理解你关于它和你的班级的要求

一般来说,如果您要定义不向类的客户端公开的结构,我会在类的私有部分或头文件中的子命名空间
详细信息
中定义它们,例如:

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

  } // namespace Details


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

} // namespace YourCoolLibrary

还有更多的选择。如果将其放入类中,则必须选择它是公共的、受保护的还是私有的,从而使类定义对该类的每个用户可见,只显示派生类,不显示其他类

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


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

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

否则,你不会因为筑巢类型而被神圣的愤怒击倒(考虑到SGI不是一个阴燃的火山口)。这是非常以上下文为中心的,所以在您根据需求定义的规则之外没有硬性的规则

如果客户机可访问性不是问题,我会在标题中声明适当范围内的大部分内容,并记录代码的含义。同样,这是如果我没有严格的使用/可读性指导方针来执行的话。如果我同意马克的建议,我会同意的


两美分:你可以尝试枚举图像类型,并使用一个公共结构来配置数据,这样你就可以在关闭的门上拉其他东西了。< /p>为什么C++中使用结构上的Type?你可以只使用结构的名称。因为我习惯了C,旧习惯很难改掉。是的,我知道它存在于win32中,但我将把它移植到非windows平台。我正在重新设计结构,以便使用它与win32中的使用方式相同。