C++ 中指向自身内部类的指针

Adh*_*hil 5 c++

我正在分析 c++ 中的一些代码,我遇到了这个配置。

class jack {
  //rest of the class body here
  public:
    jack *a;
};
Run Code Online (Sandbox Code Playgroud)

在该配置中使用指针的理论是什么?

sky*_*ing 7

这里没有什么特殊的理论。

允许声明指向不完整类型的指针,包括声明中的类型。因为内部的指针class jack指向class jack它并不一定意味着该指针指向同一个对象。

这是因为编译器实际上不需要了解有关指针的目标类型的更多信息,因为指针基本上只是一个地址。首先,当您使用指针执行某些操作时,它需要是一个完整的类型(例如,在取消引用它、访问成员或方法、执行指针算术等时)。

为了允许构建广泛的数据结构(包括链表、树等),需要允许这一点。在 C 中它也很有用,因为它允许通过不将结构的内容暴露在编译单元之外来隐藏数据(数据隐藏是通过在struct标头中前向声明 并在实现该结构的 API 的 C 文件中拥有完整的定义来完成的) )。


Ahm*_*tar 5

包含指向自身的指针的类在许多情况下都很有用。

但是,在我提出这些场景之前,需要了解以下事实:

只是类的定义:

class jack {
//rest of the class body here
 public:
  jack *a;
};
Run Code Online (Sandbox Code Playgroud)

并不意味着存在任何存在,除非一个对象:

jack obj;
Run Code Online (Sandbox Code Playgroud)

该类的创建。

因此,这实际上意味着,当 创建obj类的对象时,它将在其中包含一个指针,该指针可能指向同一类的另一个对象。jacka

现在,如果满足以下条件,这可能很有用:

  • 需要创建对象链,请参阅链接列表

  • 一个对象可以与另一个相同类型的对象相关联。例如:每个Employee 都可以有一个Manager,而 Manager 本身也是一个 Employee :

     class Employee {
     //rest of the class body here
      public:
       Employee *manager;
     }
    
    Run Code Online (Sandbox Code Playgroud)

并且对象可以具有如下关系:

    Employee salesManager;
    Employee salesWorker;
    salesWorker.manager = &salesManager;
Run Code Online (Sandbox Code Playgroud)
  • 在处理不同问题的同时,您还会遇到许多其他人。