Classes interdépendantes

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous,

Je tente d’écrire un wrapper en C++ pour une bibliothèque qui est à l’origine en C. Le but est de me simplifier la vie, profiter du RAII et de l’OO où c’est pertinent et utile, etc.

J’ai deux classes interdépendantes, et je ne trouve pas de solution.

class A {
...
B createB ();
};

class B {
...
A createA ();
};

Un objet A peut créer un objet de type B et vice-versa.

Je n’utilise pas de références/pointeurs car les objets sont particulièrement peu coûteux à copier. En fait, je ne manipule que des handles. sizeof(A) = 2*sizeof(void*) par exemple. Je n’ai pas besoin non plus que les classes soient polymorphes.

A ne contient pas de référence/pointeur vers B, et B ne contient pas de référence/pointeur vers A. Un objet B créé à partir d’un A est indépendant du A d’origine, et un objet A créé à partir d’un B est aussi indépendant du B d’origine.

Que puis-je faire ? Est-ce que ce que je cherche à faire est impossible ? Est-ce que je suis obligé que soit createA() soit createB() retourne une référence ou un pointeur ?

Est-ce que mon approche est maladroite, idiote ou totalement inutile et est-ce que je devrais me contenter d’utiliser la bibliothèque C telle quelle ?

Faire une déclaration antaicipée de A et/ou de B ne semble pas résoudre le problème. J’ai aussi essayé de "rajouter" une méthode après la déclaration de la classe en la déclarant volontairement en-dehors, p.ex. B A::createB ();`, mais le compilateur n’en veut pas non plus.

Merci. ET bonne année.

+0 -0

En fait, tu devrais avoir un découpage assez proche de :

// A.h

class B;

class A { /* ... */ }; // uniquement les déclarations ici

Et :

// B.h

class A;

class B { /* ... */ }; // uniquement les déclarations ici

Et dans A.cpp (là où tu mettras tes définitions pour la classe A) tu inclus B.h, et tu suis la même logique dans B.cpp, et ça devrait bien marcher :)

+0 -0

As-tu bien séparé toute la partie déclaration de la partie définition ?

Non, c’était bien là le problème.

Il y avait une méthode inline du genre:

inline A createA2 () { return createA(); }

J’ai pas tilté tout de suite qu’il avait besoin du constructeur de copie (ou de déplacement) (celui par défaut), et donc de la déclaration complète de la classe.

En fait, tu devrais avoir un découpage assez proche de :

Vu que c’est un wrapper, je ne me suis pas amusé à séparer les classes dans des fichiers différents, il y a un .hpp et un .cpp pour tout. Le .cpp sera compilé en une DLL et j’aurais ensuite juste besoin du .hpp.

Du coup désolé pour le dérangement, sujet finalement résolu par moi-même. Merci.

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte