Переслать объявление и имя, используя новое ключевое слово

Я получаю сообщение об ошибке ниже в классе, объявив новый указатель типа 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 ответа

Решение

В вашем коде было много ошибок. Они связаны с предварительным объявлением, полным использованием имени и т. Д.

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; 
} 
b* obj_b = new b;

И есть твоя проблема. Вы можете объявить указатель на B, потому что все указатели имеют одинаковый размер, но вы не можете создать его или взять один по значению, не предоставив определение класса компилятору. Как можно узнать, как выделить память для неизвестного типа?

Другие вопросы по тегам