【问题标题】:Cross referencing included headers in c++ program交叉引用 C++ 程序中包含的标头
【发布时间】:2010-11-28 14:20:21
【问题描述】:

我很好奇设置如下示例的场景:

下面的代码将放在名为 Header1.h 的文件中:

#ifndef HEADER1_H
#define HEADER1_H

#include "Header2.h"

class Class1
{
 Class2 class2Instance;
};

#endif

下面的代码将放在名为 Header2.h 的文件中:

#ifndef HEADER2_H
#define HEADER2_H

#include "Header1.h"

class Class2
{
 Class1 class1Instance;
};

#endif

执行此操作时会收到错误消息(因为我假设包含),但感觉我需要执行此操作才能将每个对象包含在单独的类中。谁能帮我完成这个,我做错了什么?

【问题讨论】:

    标签: c++ class include


    【解决方案1】:

    问题在于 Class1 的大小取决于 Class2,反之亦然。因此,没有办法计算任何一个的大小。前向声明其中一个类,并将其中一个属性更改为指针或引用:

    #ifndef HEADER2_H
    #define HEADER2_H
    
    class Class1;
    class Class2
    {
     Class1 *class1Instance;
     // or
     Class1 &class1Instance;
    };
    
    #endif
    

    【讨论】:

    • 这是一个很好的答案,但它只解决了我的一半问题。我仍然将这两个类放在两个单独的标题中。当我键入它们时,我只收到包含语句的错误,而没有包含循环类。你知道如何在不将它们放在同一个标​​题中的情况下规避这个问题吗?
    • 您收到什么错误?您发布的代码与包含指令没有任何问题。
    • 那么也许您应该给我们一个反映您当前代码的修改后的示例,并准确告诉我们您遇到了什么错误。
    【解决方案2】:

    文件:header1.h

    #ifndef HEADER1_H
    #define HEADER1_H
    
    class Class2; // no need to include Header2
    
    class Class1
    {
        Class2* class2Instance;
    }
    
    #endif
    

    文件:header1.cpp

    #include "header2.h" // do include Header2 here, otherwise you will get errors
    

    改编自here

    【讨论】:

      【解决方案3】:

      这两个结构彼此无限递归——要知道Class1 的大小,您需要知道Class2 的大小,这需要Class1 的大小等。解决方法是使用至少在其中一种情况下的指针:

      #ifndef HEADER1_H
      #define HEADER1_H
      
      class Class2; // no need to include Header2
      
      class Class1
      {
          Class2* class2Instance;
      }
      
      #endif
      

      【讨论】:

        【解决方案4】:

        您不能让 Class2 包含 Class1 的实例并且让 Class1 包含 Class2 的实例。你可以做的是让每个类都包含一个引用或指针,以及另一个类类型的实例(带有适当的前向引用)。即


        class Class2;
        class Class1
        {
            Class2& class2Instance;
        };
        

        class Class1;
        
        class Class2
        {
            Class1& class1Instance;
        };
        

        【讨论】:

          【解决方案5】:

          您拥有的是经典的循环引用。在 Stack Overflow 上是 already been discussed。只需在该线程上应用接受的答案,同时用“结构”代替“类”,你就可以了。

          为清晰起见进行了编辑

          【讨论】:

          • 我相信接受的答案正是如此。所以把接受答案中的“struct”这个词改成“class”这个词,模式是一样的。请收回你毫无根据的反对票,kthxbai
          猜你喜欢
          • 1970-01-01
          • 2011-06-02
          • 1970-01-01
          • 2011-06-05
          • 2023-04-04
          • 2011-03-20
          • 2018-10-17
          • 1970-01-01
          • 2014-11-15
          相关资源
          最近更新 更多