我正在创建一个名为 ImageLoader 的类,它将用于加载各种图像格式。对于各种图像格式,使用了某些结构。例如,对于 bmp 文件,您有一个 BITMAPFILEHEADER 结构和另外两个结构。
我想知道的是,当我将类定义放在头文件中时,我是让 struct typedefs 成为类定义的一部分,还是应该在类定义之外将它们分开?
我不确定,因为如果我只是声明一个结构变量,那显然会在类中发生,但是因为我正在定义一个类型,我不确定在类中定义一个类型是否被认为是好的设计。
我正在创建一个名为 ImageLoader 的类,它将用于加载各种图像格式。对于各种图像格式,使用了某些结构。例如,对于 bmp 文件,您有一个 BITMAPFILEHEADER 结构和另外两个结构。
我想知道的是,当我将类定义放在头文件中时,我是让 struct typedefs 成为类定义的一部分,还是应该在类定义之外将它们分开?
我不确定,因为如果我只是声明一个结构变量,那显然会在类中发生,但是因为我正在定义一个类型,我不确定在类中定义一个类型是否被认为是好的设计。
我的一般规则是,如果它只与该类一起使用,则在内部声明它(这意味着所有权);否则单独声明。
如果您尽可能地从标头中省略所有内容,您将获得更好的封装。即使您的类的某些方法需要结构体的参数或返回类型,您也可以使用前向声明。
只有当它是公共接口的一部分时,您才需要将其放在标头中。
至于它是否进入课堂,请考虑它是否单独有用,或者它是否完全服从于课堂。如果它可以独立,它可能应该放在自己的标题中。
我不会说在类中声明类型是糟糕设计的指标。假设您提到的“设计”意味着“可读性”,我会坚持一致性,并坚持以相同的方式表达相同的关系。
否则,您将不会被嵌套类型的神圣愤怒击倒(考虑到 SGI 不是冒烟的火山口)。这是非常以上下文为中心的,因此除了根据您的要求定义的内容之外,没有硬性规定。
如果客户端可访问性不是问题,我会在标题中的适当范围内声明大部分内容,并仅记录我的代码的含义。同样,这是如果我没有严格的使用/可读性指南来强制执行。如果我愿意,我会接受马克的建议。
两分钱:您可以尝试枚举图像类型并使用一个公共结构来存储配置数据,这样您就可以证明将其他所有东西都关在门后。
BITMAPFILEHEADER是 Win32 平台 SDK 中定义的结构。我不确定我是否理解你的要求和你的课程......
一般来说,如果您要定义不向类的客户端公开的结构,我会在类的私有部分或Details
头文件的子命名空间中定义它们,例如:
namespace YourCoolLibrary
{
namespace Details
{
struct SomeInternalStructure
{
...
};
} // namespace Details
class YourCoolClass
{
...
private:
Details::SomeInternalStructure m_something;
};
} // namespace YourCoolLibrary
还有更多的选择。如果你把它放在类中,你必须选择它是公共的、受保护的还是私有的,使类定义对类的每个用户可见,只有派生类或没有其他类。
如果您不需要类定义的详细信息,我只会将声明放入 ImageLoader 以使其更简单。内部类的完整定义然后进入实现文件。
我的经验法则是使名称尽可能本地化,所以如果我不小心在错误的地方使用它,编译器会抱怨。
如果typedef
逻辑上属于您正在创建的类,请将其放在里面;如果它在全球范围内有意义,请将其留在外面。