class a;
class b;
class a {
b c;
};
class b {
};
Почему это не компилируется? У меня создалось впечатление, что если вы объявили прототипы классов, неважно, в каком порядке они были объявлены. Однако это не работает. В визуальной студии это дает мне:
error C2079: 'a::c' uses undefined class 'b'
В g++ он дает мне:
error: field 'c' has incomplete type
Что я делаю не так?
Когда компилятор видит
class a {
b c;
};
он знает, что существует b
, но он не знает, что это (следовательно, он не знает, сколько места он потребует, следовательно, он не знает, как построить a
)
Однако то, что вы можете сделать, это использовать указатель на b
:
class a {
b* c;
};
Редактировать:
Это означает, что вы не сможете манипулировать буквой b
до ее определения. Например: вы не можете:
class a {
b* c;
void f(){
c->doSomething(); // <- Won't compile
}
};
Что вы можете сделать, это разделение a
определение в .hh
и .cc
:
в a.hh
class b; //Say it exists. Don't say what it looks like
class a {
b* c;
void f();
};
в acc
#include "b.hh" //now it ok to use b.hh: it won't yield a circular reference because b.hh may include a.hh but it doesn't include a.cc
void a::f(){
c->doSomething();
}
В то время, когда a
использует b
он был объявлен (потому что вы написали class b;
над ним), но не определен (определение ниже a
). "Неполный тип" означает, что тип был объявлен, но не определен.
c
былb*
(указатель)