2016-03-10 2 views
-1
class B; 

class A 
{ 
    B b; 
    A(); 

}; 

class B 
{ 
    A a; 
    B(); 
}; 

У меня есть два класса следующим образом. По какой-то причине, даже если я вперед объявить класс B, у меня есть ошибка, которая говорит, что:Базовая форвардная декларация не работает

field 'b' has an incomplete type! 

Почему это так?

+0

Следует ли использовать указатель/ссылку для хотя бы одного члена? (в настоящее время ваши классы будут иметь бесконечный размер). – Jarod42

+0

спрашивает, почему в этом конкретном случае форвардная декларация не работает, это не то же самое, что просить «Можете ли вы объяснить» форвардное объявление «далее?» Или «Когда я могу использовать объявление вперед?», Вы могли бы пометить как дубликат для настоящий дубликат вроде этого: http: // stackoverflow.com/questions/20202231/slaying-the-circle-depend', который фактически содержит технический ответ (почему он не может работать?: ответ 1) и концептуальный ответ (почему это никогда не должно быть разрешено работать? Ответ 2). Если вы собираетесь заблокировать любой ответ, отметив его как дубликат, потребуется время, чтобы связать REAL duplicate – Guiroux

ответ

0

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

Если вы только объявить указатель или ссылку тогда компилятор должен только имя символа.

Так что если вы меняете A::b на указатель (то есть B* b) или ссылку (B& b), тогда он будет работать.

Смежные вопросы