According to the wording used by the site of the BOUML UML toolbox, "directional" has to be understood as "unidirectional" (opposed to "bidirectional") :
aggregation : to define a bi-directional aggregation, the code
generators will produce two attributes whose names are the roles's
name. This kind of relation may considered to be a shortcut to define
two (directional) aggregations.
This "directional" term refers hence to navigation possibility between the related objects. For comparison, in MSVC2015 you find the notion of direction in the "Is Navigable" property of the association.
The unidirectional aggregation could therefore be for example:
class Member { ... }; // member of a club
class Club {
list<Members*> members; // you can go from Club to Members but not the contrary.
...
};
The bidirectional aggregation should then be something like:
class Club;
class Member { // member of a club
list<Club*> clubs; // club to which a membershib relation exist.
...
};
class Club {
list<Members*> members; // you can go from Club to Members and now back.
...
};
For undirectional composition, we could have for example:
class Element { ... }; // Elemetn doesn't know parent (=> unidirectional)
class Object {
vector<Element> element; // own by value for example
...
};
Or:
class Element { ... };
class Object {
vector<unique_ptr<Element>> element; // ownnership by unique pointer
...
};
Bidirectional composition could then be something like:
class Object;
class Element {
Object *parent; // you can navigate back (Element knows about parent)
...
};
class Object {
vector<Element> element; // own by value for example
...
};