web-dev-qa-db-fra.com

Existe-t-il un moyen de générer automatiquement des getters et des setters s'ils ne sont pas présents en C++?

J'ai de l'expérience avec Objective-C et dans Objective-C, vous pouvez laisser le compilateur générer des getters et des setters s'ils ne sont pas déjà présents (@synthesize).

Existe-t-il un moyen de faire cela en C++ ou dois-je implémenter moi-même tous les accesseurs?

19
user142019

Je ne suis pas au courant d'un tel utilitaire et il ne serait probablement pas très utile en C++ moderne idiomatique:

Les directives modernes du C++ stipulent que votre classe ne devrait pas avoir des getters et des setters . En fait, les setters sont presque complètement inutiles et les accesseurs n’ont qu’une utilité très limitée. Ceci est lié au principe bien établi de l’ingénierie logicielle dites, ne demandez pas .

Si vous souhaitez modifier l'état d'une instance de classe, vous pouvez procéder de deux manières:

  1. Vous effectuez une action qui modifie son état.
  2. Vous créez une nouvelle instance.

La mutation de l'état via les setters est généralement un signe d'odeur de code et une mauvaise conception architecturale.

Je conviens qu’il existe des exceptions à cette règle, uniquement pour des raisons pratiques. Et c’est bien, mais les exceptions sont assez peu nombreuses pour qu’elles ne justifient pas les outils permettant de générer automatiquement des accesseurs et des passeurs. En fait, vous pouvez utiliser cela comme un test décisif: lorsque vous souhaitez disposer d'un outil pour générer automatiquement ce type de passe-partout, prenez du recul et réexaminez votre conception.

30
Konrad Rudolph

Ce n'est pas le compilateur lui-même, mais un IDE comme Eclipse CDT peut en fait effectuer cette action automatiquement (clic droit sur la classe> Source> Générer des getters et des setters ...).

8
ascanio

Vous devez les mettre en œuvre vous-même

5
flumpb

Il n'y a pas moyen de faire ça. Toutefois, si vous utilisez un IDE complet comme Eclipse (vous ne savez pas si Visual Studio est doté de cette fonctionnalité), il existe des options pratiques pour que le IDE génère le code d'accesseur en lecture/écriture pour vous.

4
Eugene S

Non, le compilateur ne vous aide pas avec ça. Vous pouvez par exemple créer une MACRO ou générer du code lors de votre étape de construction.

2
duedl0r

L’avantage pour moi d’utiliser des accesseurs (particulièrement faciles sous la forme de c # vb.net) est 

1/la possibilité de définir un point d'arrêt dans un setter ou un getter sinon vous ne pouvez pas savoir qui et quand a accès au membre. 

2/Vous pouvez contrôler quelle valeur est définie en cas de nécessité de tester le débordement ou un autre ensemble incorrect. Ceci est particulièrement nécessaire dans une bibliothèque publique, comme un éditeur de propriétés pour votre composant visuel par exemple. 

Mais cela n’est pas vraiment nécessaire dans votre classe interne privée. Ensuite, le choix d'un accès contrôlé à un membre doit être défini à partir de l'utilisation publique finale de votre objet, je pense.

1
zpsthg

Au moins dans Visual Studio 2015, je ne le trouve pas. Cependant, si vous utilisez Resharper, il pourrait générer les paramètres setter et getter dans le fichier .h. 

0
magallanes

Si vous utilisez une sorte de framework qui générera les POCO pour vous, alors oui, il est possible de "générer" le code standard pour y arriver, mais vous devez introduire le concept dans le framework ou IDE premier. 

0
user195488