Vous pouvez utiliser une déclaration directe dans certains cas, mais vous devrez utiliser le type complet chaque fois que vous en utiliserez réellement. Il pourrait être utile de préciser la question sur ce que vous voulez vraiment réaliser, car il pourrait y avoir des approches plus simples de votre problème (si l'ordre est important, cela pourrait indiquer une dépendance circulaire entre les classes A et B). bien).
class B;
class A
{
public:
A(B b, B* bp, B& br) : bp_(bp), br_(br) {} // ok, incomplete types can be used as argument types
B f()
// { return B(); } // nok: cannot create objects of incomplete type
;
B* f2() { return bp_; } // ok
B& f3() { return br_; }; // ok
void g()
// { bp_->g(); br_.g(); } // nok: cannot call methods of an incomplete type
;
void g(B const & b)
// { b.g(); } // nok: cannot call methods of an incomplete type
private:
B * bp_; // ok (also const version)
B & br_; // ok (also const version)
// B b_; // nok: B must be a complete type here
};
class B { // A is complete, any use is correct here
void g() {}
};
// From here on, B is a complete type and can be used in any possible way
B A::f() {
return B(); // ok, now B is complete
}
void A::g() {
br_.g(); // ok, B is complete here
bp_->g(); // ok, B is complete here
}
void A::g(B const & b) {
b.g();
}
hey cela a vraiment aidé! Merci –
"vous ne pouvez utiliser des pointeurs ou des références à une classe que si elle a été entièrement définie". Autant que je sache, vous pouvez également passer des classes par la valeur vers et à partir des fonctions ... – SadSido
Où est le prix de _deciphering_ cette question? – bobobobo