Передовая декларация и TypeName с использованием нового ключевого слова

StackOverflow https://stackoverflow.com/questions/4221918

Вопрос

Я получаю ошибку ниже в классе объявление нового указателя типа 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;
}
Это было полезно?

Решение

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

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, потому что указатели все одинаковые размеры, но вы не можете построить один или принимать по одному по значению, не предоставив определение класса компилятору. Как это возможно знать, как выделить память для неизвестного типа?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top