在类内部声明结构

declaring struct inside of a class

本文关键字:结构 声明 内部      更新时间:2023-10-16

我正在阅读一个游戏框架,它在Room class内部有一个Door struct,如下所示:

#include <vector>
class Room{
public:
    struct Door{
        unsigned name;
        unsigned orientation;
        Room* room1;
        Room* room2;
    };
    std::vector<Door*> adjacent;
};

在类内部定义结构的目的是什么?而且,定义结构的访问修饰符有什么区别吗?

在类内部定义结构的目的是什么?

它只是一个嵌套类型。

而且,定义结构的访问修饰符有什么区别吗?

如果Door声明private则尝试在此类之外声明类型 Room::Door 的变量将给出错误。

在类内部定义结构的目的是什么?而且,定义结构的访问修饰符有什么区别吗?

没有两个人会给你相同的答案,但是我们可以告诉你效果是什么:

  • 在"房间"的范围内,您可以将类称为"门"。

  • 在 Room 范围之外,您必须将该类称为 Room::D oor

  • 是的,类型的可见性与任何类成员相同,并且受私有、受保护和公共的影响。

目的是创建一个类型,该类型不仅该类型的实例由周围的类拥有,而且类型本身也由周围的类拥有。

对于一个明显的例子,大多数容器类型会将该容器的iterator类型定义为嵌套类(或结构)。尽管vector<T>::iteratordeque<T>::iterator表示类似的概念,但每个概念仍由其关联的容器类型拥有并特定于其关联容器类型。

就访问说明符而言,它们遵循通常的规则 - 如果您将结构/类定义private,则它仅对同一类中的其他代码可见。如果它是protected的,它将对该类及其后代可见。如果它是公开的,那么每个人都可以看到它。

举一个更具体的例子,对于企业的职位,您可能有:

class secretary  {};
class executive {
   class secretary {};
};

在这种情况下,::secretary是"正常"秘书,executive::secretary是执行秘书 - 尽管明显相似,但执行秘书的职位描述通常至少与非执行秘书的职位描述有些不同。执行副总裁可能有一个执行秘书和两个"正常"秘书,但较低级别的经理可能只被授权有一个普通的秘书,而不是执行秘书。

在实际编程中,你经常有私有嵌套类——不像执行秘书与普通秘书不同,其中一些是世界其他地方甚至根本不知道它们存在的东西(至少除非他们查看标题的私有部分当然)。

简短回答:structclass在C++中的意思完全相同,除了默认访问。门只是一个嵌套类。换句话说:

struct Door{
    ...

与以下相同:

class Door{
    public:
    ...

嵌套类对于组织和文档原因很有用。它类似于命名空间,但在C++中早于namespace