代码之家  ›  专栏  ›  技术社区  ›  Diogenes Creosote

相互引用类产生“不完整类型”错误

  •  3
  • Diogenes Creosote  · 技术社区  · 15 年前

    我遇到了一种情况,在这种情况下,a引用了B中定义的C类,而C有一个B类的实例。

    当我试图编译下面的代码时,我得到了“ field a has incomplete type ". 我假设这是因为编译器不知道应该为一个实例分配多少内存。

    class A;
    
    class B {
    public:
      class C {
        A a;
      };
    };
    
    class A {
      A(const B::C& _c) 
        : c(_c)
      {}
      const B::C& c;
    };
    

    C in class B does not name a type ":

    class B;
    class B::C;
    
    class A {
      A(const B::C& _c) 
        : c(_c)
      {}
      const B::C& c;
    };
    
    
    class B {      
    public:
      class C {
        A a;
      };
    };
    

    我怎样才能让编译器相信 B::C

    2 回复  |  直到 15 年前
        1
  •  5
  •   j_random_hacker    15 年前

    作为一个绝对的猜测,我注意到有一个排列你没有尝试过:

    class B {
    public:
      class C; // Forward declaration
    };
    
    class A {
      A(const B::C& _c) 
        : c(_c)
      {}
      const B::C& c;
    };
    
    class B::C {
      A a;
      C() : a(*this) {}    // Thanks Nim for pointing this out!
    };
    

    这很可能是违法的,但我认为值得一试。如果它不起作用,那我就看不到任何解决问题的办法。

        2
  •  2
  •   UncleBens    15 年前

    A 不起作用:不能声明不完整类型的实例。

    至于 B::C C 在里面 B :据我所知,这并没有给您带来任何显著的优势*并且阻止您继续声明它。

    *我能想到的唯一好处是你可以在私有部分定义它,但是 一个 一开始就和它没关系。