====== Avoiding Circular Dependencies ====== Many times, you may run into a circular dependency when writing your Elements. This happens when you have two Elements, **A** and **B**, where **A**'s Behavior method needs to use **B**, and **B**'s Behavior method needs to use **A**. **g++** won't allow you to compile code like this witout defining these methods in a certain way. This tutorial will guide you through creating Elements like this. In the repo, there are two Elements named **Element_CheckerForkBlue** and **Element_CheckerForkRed**, which were created to illustrate the correct way to get around this problem. Please use these as a reference when reading this tutorial. ===== Create **.tcc** files ===== Each Element involved in this kind of problem needs an associated **.tcc** file, which is used to define its behavior. Create one of these files per Element in the **elements/include** directory. After these are created, we need to attach them to the existing **.h** files. Just outside of the MFM namespace block, **#include** the corresponding **.tcc** file. For instance, in **A.h**, you need to **#include "A.tcc"** . ===== Include dependencies ===== In each **.tcc** file, we can now **#include** the Elements that we wish to reference in our behavior function. For instance, in **A.tcc**, we need to **#include "B.h"** . ===== Move Behavior method ===== Now, we need to move the Behavior method to our new **.tcc** file. Then, following the **A** example, write: namespace MFM { template void Element_A::Behavior(EventWindow& window) const { /* Define Behavior for Element_A here. */ } } Then, in our **.h** file, we need to change the definition of our Behavior method to a prototype. Simply get rid of the body of the Behavior method and place a semicolon at the end of the line, like this: virtual void Behavior(EventWindow& window) const; Once you do this for both elements, they should now be able to reference each other and compile. ===== Tips ===== * Make sure your **.h** file does **NOT** **#include** the Element which causes the circular dependency. Only your **.tcc** should do this. * Your Behavior method might not be the only one with a circular dependency like this. Make sure to define any other methods which do in your **.tcc** as well.