6

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

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

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

4

6 回答 6

7

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

于 2012-04-13T16:15:38.870 回答
3

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

只有当它是公共接口的一部分时,您才需要将其放在标头中。

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

于 2012-04-13T16:58:11.330 回答
3

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

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

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

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

于 2012-04-14T05:08:34.350 回答
1

BITMAPFILEHEADER是 Win32 平台 SDK 中定义的结构。我不确定我是否理解你的要求和你的课程......

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

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

  } // namespace Details


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

} // namespace YourCoolLibrary
于 2012-04-13T17:10:40.970 回答
1

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

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

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

于 2012-04-13T18:02:07.213 回答
0

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

于 2012-04-13T16:14:19.383 回答