Tout d'abord, vous ne devriez pas mettre le code dans les fichiers .h sauf si vous savez ce que vous faites (voir inline functions, principalement utilisé pour la vitesse)
Puis, en main.h, vous ne avez pas besoin de référence R. Dans main.cpp cependant, vous devrez inclure Ah Rappelez-vous que UML est agnostique, il est utilisé pour dessiner "qui parle à qui" plutôt que "qui compile avec qui".
Le plus souvent, votre compilateur C++ génère un fichier de sortie (avec gcc ce sont des fichiers .o, Visual Studio le fait aussi de manière transparente) pour chaque fichier cpp. Tous les fichiers de sortie seront alors fusionnés ensemble (la plupart du temps) dans votre application ou votre bibliothèque et seulement alors votre fonction sera liée.
Vous pouvez également jeter un coup d'œil à forward references. C'est pour dire au compilateur (pas à l'éditeur de liens) que "cette classe existe, vous ne le savez peut-être pas en ce moment, mais je jure devant Dieu qu'elle existera dans le blob".
Dans votre cas particulier, je dessinerais le diagramme de classes comme votre deuxième exemple, que vous n'utilisiez qu'un ou plusieurs fichiers cpp. Votre classe principale ne sait sur A.
Maintenant, imaginez que votre classe C ont des méthodes telles que
A* C::createA()
{
return new A;
}
B* C::createB()
{
return new B;
}
Ensuite, votre classe principale aurait
int main()
{
C* instance1 = C::createA();
C* instance2 = C::createB();
}
Dans ce cas, votre classe principale perdrait toutes les connaissances intimes de A et B, conformes à votre premier schéma. Cela créerait bien sûr plus de couplage entre A, B et C, ce qui apporte ses propres problèmes mais est plus proche d'un factory pattern
Dans votre question, "Quel est le bon si je voulais faire la même chose? en interprétant mal les relations UML en C++? ", essayez d'utiliser les noms propres au lieu de" un "ou" juste "ou" faites la même chose "parce qu'ils sont vagues et/ou ambigus. En étant verbeux, cela nous aide à comprendre rapidement ce que vous essayez de trouver. Pourriez-vous réviser cela s'il vous plaît? Et, pourriez-vous mettre à jour le titre de la question pour être plus précis aussi s'il vous plaît? – Homer6
@Juan UML représente purement les relations entre les classes et n'est pas basé sur l'emplacement physique de ces classes. – allen