【问题标题】:Declare an object even before that class is created甚至在创建该类之前声明一个对象
【发布时间】:2010-09-11 22:04:31
【问题描述】:

在 C++ 中创建类之前,是否需要声明一个类的对象?我问是因为我正在尝试使用两个类,第一个类需要在其中包含第二个类的实例,但第二个类也包含第一个类的实例。我意识到您可能认为我可能会陷入无限循环,但实际上我需要在第一个类之前创建第二个类的实例。

【问题讨论】:

    标签: c++ class object instantiation


    【解决方案1】:

    你不能这样做:

    class A {
        B b;
    };
    class B {
        A a;
    };
    

    最明显的问题是编译器不知道生成类 A 需要多大,因为 B 的大小取决于 A 的大小!

    但是,您可以这样做:

    class B; // this is a "forward declaration"
    class A {
        B *b;
    };
    class B {
        A a;
    };
    

    将类 B 声明为前向声明允许您使用指向该类的指针(和引用),而无需完整的类定义。

    【讨论】:

      【解决方案2】:

      你不能声明一个未定义类的实例,但你可以声明一个指针指向一个:

      class A;  // Declare that we have a class A without defining it yet.
      
      class B
      {
      public:
          A *itemA;
      };
      
      class A
      {
      public:
          B *itemB;
      };
      

      【讨论】:

      • ...或引用一个:MyClass & rMyObject;
      【解决方案3】:

      an elegant solution 使用模板。

      template< int T > class BaseTemplate {};
      typedef BaseTemplate< 0 > A;
      typedef BaseTemplate< 1 > B;
      // A
      template<> class BaseTemplate< 0 >
      {
      public:
         BaseTemplate() {} // A constructor
         B getB();
      }
      
      // B
      template<> class BaseTemplate< 1 >
      {
      public:
         BaseTemplate() {} // B constructor
         A getA();
      }
      
      inline B A::getB() { return A(); }
      inline A B::getA() { return B(); }
      

      此代码将起作用!那么,为什么会这样 工作?原因与如何 模板被编译。模板 延迟函数的创建 签名,直到您实际使用 模板某处。这意味着 getA() 和 getB() 都不会 他们的签名被分析到之后 A 类和 B 类都已经 完全宣布。这就是魔力 这个方法。

      【讨论】:

      • 有趣(虽然它包含几个错别字)。但“getA”和“getB”实际上是工厂:它们返回新实例(按值)。 A 的实例没有 B,B 的实例也没有 A。
      【解决方案4】:

      这是否接近您想要的:第一个类包含第二个类,但第二个类(即首先创建的)只是对第一个类的引用?

      【讨论】:

      • 我实际上是在尝试做相反的事情,第一个类引用第二个类,第二个类包含第一个类的实例。
      【解决方案5】:

      这称为交叉引用。请参阅here 示例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-22
        • 1970-01-01
        • 1970-01-01
        • 2012-04-26
        • 1970-01-01
        • 1970-01-01
        • 2020-03-01
        • 2016-05-25
        相关资源
        最近更新 更多