переслать объявление и имя, используя новое ключевое слово - PullRequest
1 голос
/ 19 ноября 2010

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

6 голосов
/ 19 ноября 2010
b* obj_b = new b;

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

1 голос
/ 19 ноября 2010

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

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; 
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...