Désolé d'upper ce vieux topic, mais j'ai une erreur un peu près similaire à ce que j'y comprends. J'ai presque fini une encapsulation du moteur physique Newton codé en C dans une interface C++. En gros, chaque objet a besoin d'un monde physique, qui doit être créé avant tout le monde :
PhysicsWorldPtr physicsWorld (new PhysicsWorld ());
Ou PhysicsWorldPtr est un simple typedef sur un shared_ptr.
Pour l'instant, pour créer un objet collider par exemple, je dois faire ceci :
PhysicsColliderPtr physicsCollider (new PhysicsCollider (physicsWorld.get());
Sachant que je dois envoyer le monde physique a tous mes autres objets (joints, corps physiques, colliders, matériaux...), j'aimerais centraliser quelques fonctions à l'intérieur de ma classe PhysicsWorld, pour pouvoir faire ceci :
PhysicsColliderPtr physicsCollider = physicsWorld->CreateCollider ();
Le problème c'est que je rencontre le fameux problème d'inclusion cyclique. Chacun de mes objets incluant le fichier PhysicsWorld, pour l'isntant ce que j'arrive à faire sans soucis c'est : 1) Faire des déclarations anticipées dans mon PhysicsWorld, et créer les typedefs ; 2) Déclarer les fonctions de création dans l'en-tête ; 3) Définir dans le fichier source les fonctions, en incluant mes fichiers (par exemple PhysicsCollider), afin que le pointeur intelligent ait sufisamment d'infos sur le constructeur et qu'il m'autorise à construire ces objets.
Toutefois j'aimerais déclarer ces petites fonctions de création comme étant inline, et donc les définir dans un fichier .inl, mais 1) si j'inclue les fichiers .hpp des autres classes => inclusion cyclique donc le compilo gueule ; 2) si je me contente que des déclarations anticipées, le shared_ptr n'a pas assez d'info et gueule aussi : error C2514: 'PhysicsCollider' : class has no constructors
Je pense que ce n'est pas possible autrement que de définir ces fonctions dans le .cpp et inclure ici les fameux fichiers .hpp (d'ailleurs, est-ce que cela alourdit les temps de compilation, même si ces fichiers ont déjà été inclus autre part ?).
Partager