【问题标题】:typedef structs declared inside class or outside?typedef 结构在类内部或外部声明?
【发布时间】:2012-04-13 16:12:19
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么在 C++ 中对结构使用 typedef?您可以只使用结构的名称。
  • 因为我习惯了 C 并且旧习惯很难改掉。

标签: c++ visual-c++


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      否则,您将不会被嵌套类型的神圣愤怒击倒(考虑到 SGI 不是冒烟的火山口)。这是非常以上下文为中心的,因此除了根据您的要求定义的内容之外,没有硬性规定。

      如果客户端可访问性不是问题,我会在标题的适当范围内声明大部分内容,并仅记录我的代码的含义。同样,这是如果我没有严格的使用/可读性指南来强制执行。如果我愿意,我会接受 Mark 的建议。

      两分钱:您可以尝试枚举图像类型并使用一个公共结构来存储配置数据,这样您就可以证明将其他所有东西都关在门后。

      【讨论】:

        【解决方案4】:

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

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

        namespace YourCoolLibrary
        {
          namespace Details
          {
            struct SomeInternalStructure
            {
              ...
            };
        
          } // namespace Details
        
        
          class YourCoolClass
          {
            ...
          private:
            Details::SomeInternalStructure m_something;
          };
        
        } // namespace YourCoolLibrary
        

        【讨论】:

        • 是的,我知道它存在于 win32 中,但我将把它移植到非 Windows 平台上。我正在重新制作结构,因此使用它与在 win32 中使用它的方式相同。
        【解决方案5】:

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

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

        我的经验法则是使名称尽可能本地化,所以如果我不小心在错误的地方使用它,编译器会报错。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-11-06
            • 2012-02-06
            • 1970-01-01
            • 2017-05-21
            相关资源
            最近更新 更多