Относительно предварительного объявления класса C ++

0

У меня есть два класса:

class B;

class A {
public:
  int a, b;
  B *b;
public:
  int getctxt()
  {
     b->getctxt1();
  }
}

Class B {
public:  
  int c,d;
  A *a; 
  getctxt1()
  {
      /* something */
  }   
}

main()
{
  B *b = new B();
  A *a = new A();
  b->a = a;
  a->b = b;
}

Но когда я пытаюсь скомпилировать, это говорит

недопустимое использование неполного типа 'struct A.

Может ли кто-нибудь сказать мне, как это решить?

Теги:
forward-declaration

3 ответа

2
Лучший ответ

Определения функции члена встроенного класса анализируются так, как если бы они появились сразу после определения класса. Конечно, B не определяется в этот момент. Поэтому переместите определение функции члена для A::getctxt из определения класса A:

class B;

class A { int getctxt(); /* ... */ };

class B { /* ... */ };

int A::getctxt()
{
    b->getctxt1();   // at this point, *b has complete type!
    return -35;
}
  • 0
    Я это сделал. Пока я не получу ту же ошибку :( .. Я переместил определение getctxt () за пределы A.
  • 0
    @ user1667630: Вы переместили его через определение B ?
0

Кто-нибудь не заметил ошибку синтаксиса Class B? строчная class является правильной. и те два открытых члена в с тем же именем int b и B *b.

как только вы удалите их и закончите определения классов с точкой с запятой, добавьте тип void getctxt1() в void getctxt1() который отсутствует в B.

просто определите функции так, как они должны быть определены. не встроенный без причины, что вы знаете, что есть!

0

По этой причине рекомендуется разделять ваши классы в файле.h и файле.cpp. Когда вы пишете class B; , вы сообщаете компилятору, что есть класс под названием B, но это он, компилятор не знает, что находится внутри этого класса. Когда компилятор достиг линии b->getctxt1(); , он знает, что b является экземпляром B, но он не знает, является ли getctxt1() методом B, потому что это ниже. Если вы пишете все в одном файле, вы должны сначала написать все объявления, а затем все реализации.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню