Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

classes interdépendantes : déclarer une classe sans la définir

21 réponses
Avatar
meow
J'ai deux classes, A et B, chacune d=E9pend de sous parties de
l'autre... et j'aimerai si possible =E9viter de multiplier mes arguments
templates. Y a t'il un moyen d'=E9crire quelque chose du genre :

class A; //! t'inqui=E8tes pas copain compilo, la d=E9finition vient plus
loin
class B{
// j'utilise des types d=E9finis dans A
};
class A { // tu vois j'ai pas menti !
// j'utilise des types d=E9finis dans B
}

Bon, ok, =E7a a pas l'air bien joli niveau design... Alors si en sus
vous aviez des conseils pour =E9viter ce genre d'horreur. Je vous
explique un peu mieux mon probl=E8me, histoire de pas parler dans le
vide :

Ma classe A est une structure de donn=E9e qui rend compte d'un objet
volumique (une triangulation 3D, donc un ensemble de tetraedres,
triangles, arretes et sommets avec les relations d'incidences qui vont
bien)
Ma classe B est une structure de donn=E9e qui rend compte d'un objet
surfacique (demi arete, pour qui connait (merci Mr Kettner) )
j'ai un objet a de type A et je veux construire son bord sous la forme
d'un objet b de type B. Pour cette construction, je vais avoir besoin
de stocker les "=E9chafaudages" de b dans a. Donc A doit connaitre B (ou
du moins certaines sous parties de A doivent connaitre certaines sous
parties de B)
Mais je veux aussi que les sommets de b gardent l'information de leur
origine dans a (grosso modo je veux que les sommets de b pointent sur
les sommets de a dont ils sont issus)... moralit=E9 B doit aussi
connaitre A.
.=2E.Je fais comment ? :D

Ce a quoi j'avais pens=E9 partant de l'observation qu'il =E9tait tr=E8s laid
d'avoir un objet qui contienne les "=E9chafaudages" d'un autre, c'=E9tait
d'avoir deux classes tr=E8s proches : A et AA, la premi=E8re vierge de
toute pernition de B, et la seconde qui ne serait utilis=E9e que le
temps de la construction d'un objet de type B. A ne "connaitrait"
ainsi personne, B connaitrait A et AA connaitrait =E0 la fois A et B.
Un objet aa de type AA serait initialis=E9e par copie d'un objet de
classe A dont elle stockerait les r=E9f=E9rences dont on a besoin dans les
=E9l=E9ments de la classe B, et stockerait les "=E9chafaudages" de b avant
d'etre d=E9truit, une fois b construit.
Je pense que ce qui m'a rebut=E9 c'est le fait que ma classe A est tr=E8s
grosse et que =E7a me g=E8ne de "gaspiller" de la place m=E9moire avec deux
objets quasi identiques en m=E9moire.

1 réponse

1 2 3
Avatar
Sylvain
jeremie fouche wrote on 04/07/2007 19:11:

class B{
A* pa; // possible
A& ra; // sous reserve d'un cst: B(const A& _a) : ra(_a) { ... }


heuu y'a pas un pb de const là ?


si! ;)

Sylvain.


1 2 3