0
votes

Faire un certain nombre d'objets disponibles pour l'utilisateur

dire que j'ai construit une classe (notes de code> (notes de musique) ( note.h , note.cpp ) et voulait fournir à l'utilisateur de fournir à l'utilisateur Ma bibliothèque avec un ensemble d'objets Note les plus couramment utilisés xxx

Si l'utilisateur souhaitait utiliser un FIRAP, il / elle aurait besoin de créer un NOTE ("F '," SHARP ") objet, mais pour des raisons de simplicité, je souhaite fournir les notes racines les plus courantes en tant qu'objets.

Quoi serait possible (et le recommandé) moyen d'y parvenir?

1) Utilisation d'un fichier d'en-tête avec extern déclarations et un fichier de mise en œuvre correspondant? (Peut-être même le note.h , note.cpp fichiers?)

2) fournissant des méthodes de classe statique comme note Note :: A () {Remettre la note ('a');} etc. (bien que cette approche soit à verbeuse pour mon goût ...).

Autres solutions?


3 commentaires

Développer une bibliothèque est la tâche la plus complexe (beaucoup plus difficile que de développer une application). Il y a trop de variantes et je doute qu'il existe une manière "recommandée". Cela dépend de la conception de la bibliothèque entière.


Enum s semble être fait pour cela. (Pour le paramètre du constructeur, je veux dire)


Vous êtes peut-être intéressé d'examiner le Motif de poids volé .


3 Réponses :


1
votes

Si C ++ 17 est disponible et la commande d'initialisation statique n'est pas un problème, j'irais avec les variables inline . Si C ++ 17 n'est pas disponible, la commande d'initialisation statique n'est toujours pas un problème, j'irais avec extern déclarations et définitions dans le fichier .cpp.

S'il existe des problèmes d'ordre d'initialisation statique, j'irais avec peu de fonctions d'assistance statique, comme la vôtre.


3 commentaires

Puis-je suggérer d'ajouter un littéral attribué à l'utilisateur Consexpr au mix? Ce serait une belle syntaxe jouer ("A #" _ n + "fb" _n, 1s); :)


@Yssc, vous pouvez, mais je ne ferais pas cela))). La raison en est que je suis fatigué des problèmes d'assurance générale soudaines lorsqu'il est complètement inscrit à l'utilisateur du code que les littéraux Constexpr deviennent de plus en odr.


Qui serait?!?



0
votes

Vous pouvez utiliser une variable de membre statique dans votre classe de note. Peut-être une carte avec {Note-Type -> Count} serait suffisant? Vous devrez gérer les compteurs de vos constructeurs, mais il sera invisible à l'utilisateur de votre classe. Ensuite, vous pouvez ajouter des méthodes d'accès statiques pour les utilisateurs à extraire des données. N'oubliez pas de protéger l'accès à la carte statique si vous ou vos utilisateurs sont multi-threads.


0 commentaires

4
votes

aller pour littéraux définis par l'utilisateur 1 sup >:

play("A#"_note + "Fb"_note + "G"_note, 1s);


1 commentaires

Nice, je n'ai jamais entendu parler de ce concept et je vais certainement creuser plus loin dans cela, merci!