代码之家  ›  专栏  ›  技术社区  ›  pandoragami

使用新关键字转发声明和类型名

  •  1
  • pandoragami  · 技术社区  · 15 年前

    我在下面的a类中得到一个错误,它声明了一个b类型的新指针。请帮助。

    #include <iostream>
    
    namespace B
    {
        class b;
    }
    class a
    {
        private:
    
        B::b* obj_b;
    
        public:
    
        a(){}
        ~a(){}
        void create()
        {
            b* obj_b = new b;
        }
    };
    class b
    {
        private:
    
            a *obj_a;
    
        public:
            b()
            {
                obj_a->create();
            }
            ~b(){}
    };
    int main()
    {
        b obj;
    
        return 0;
    }
    
    2 回复  |  直到 15 年前
        1
  •  1
  •   Chubsdad    15 年前

    您的代码中有许多错误。它们与转发声明、完全限定名用法等相关。

    namespace B 
    { 
       class b; 
    } 
    class a 
    { 
    private: 
    
       B::b* obj_b;            // change 1 (fully qualified name)
    
    public: 
       void create();          // change 2 (can't use b's constructor now as B::b is not 
                               // yet defined)
       a(){} 
       ~a(){} 
    
    }; 
    
    class B::b                 // change 3 (fully qualified name)
    { 
    private: 
    
       a *obj_a; 
    
    public: 
       b() 
       { 
          obj_a->create(); 
       } 
       ~b(){} 
    }; 
    
    void a::create()             // definition of B::b's constructor visible now.    
    { 
       B::b* obj_b = new B::b;   // And here also use fully qualified name
    } 
    
    int main() 
    { 
       B::b obj; 
    
       return 0; 
    } 
    
        2
  •  6
  •   Ed Swangren    15 年前
    b* obj_b = new b;
    

    这就是你的问题。您可以声明指向B的指针,因为指针的大小都是相同的,但是如果不向编译器提供类定义,就不能构造一个指针或按值获取一个指针。如何知道如何为未知类型分配内存?

    推荐文章