У меня есть два класса:
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.
Может ли кто-нибудь сказать мне, как это решить?
Определения функции члена встроенного класса анализируются так, как если бы они появились сразу после определения класса. Конечно, 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;
}
Кто-нибудь не заметил ошибку синтаксиса Class B
? строчная class
является правильной. и те два открытых члена в с тем же именем int b
и B *b
.
как только вы удалите их и закончите определения классов с точкой с запятой, добавьте тип void getctxt1()
в void getctxt1()
который отсутствует в B.
просто определите функции так, как они должны быть определены. не встроенный без причины, что вы знаете, что есть!
По этой причине рекомендуется разделять ваши классы в файле.h и файле.cpp. Когда вы пишете class B;
, вы сообщаете компилятору, что есть класс под названием B, но это он, компилятор не знает, что находится внутри этого класса. Когда компилятор достиг линии b->getctxt1();
, он знает, что b
является экземпляром B
, но он не знает, является ли getctxt1()
методом B
, потому что это ниже. Если вы пишете все в одном файле, вы должны сначала написать все объявления, а затем все реализации.
B
?