Générer des méthodes set/get pour une classe c++
Est-il un outil qui génère à définir et à obtenir des méthodes pour une classe automatiquement.
Juste que je créer des classes très fréquemment et que vous souhaitez avoir un outil qui, pour chaque classe-membre générera les fonctions suivantes automatiquement:
Member_Type getMemberName() const; //in header file
Member_Type getMemberName() const //in source file
{
return member;
}
void setMemberName(const Member_Type & val); //in header
void setMemberName(const Member_Type & val) //in source file
{
member = val;
}
J'ai rencontré une macro comme ceci mais il n'aimait pas l'idée:
#define GETSETVAR(type, name) \
private: \
type name; \
public: \
const type& get##name##() const { return name; } \
void set##name##(const type& newval) { name = newval; }
Peut être que quelqu'un sait comment le faire avec MS Visual Studio, ou eny autre outil?
Si vous voulez que tous vos membres à être publiquement modifiables (et si vous faites vos classes ne fournissent pas toute l'abstraction) pourquoi ne pas les rendre publiques? Un
Beaucoup de réponses à la question suivante sont pertinentes: stackoverflow.com/questions/2977007/.... Bottom line: vous pouvez penser que vous voulez, mais c'est généralement une mauvaise idée.
Si la pratique de la programmation orientée objet vous oblige à faire quelque chose de stupide alors peut-être que la POO n'est pas la voie à suivre? La programmation orientée objet est un moyen pour une fin, pas un but en soi. L'objectif doit toujours être de bon, propre code. Ce n'est pas en quadruplant votre la taille du code et de l'écriture des getters/setters pour tout. (En dehors de cela, il n'est souvent pas bonne de la programmation orientée objet pratique pour ce faire. La classe doit exposer les opérations logiques qui ont du sens sur la classe. get/set ne sont généralement pas significatives des opérations, ils sont juste des raccourcis pour modifier les données internes de la classe.
Une classe pleine de getters et setters est l'antithèse de l'OO.
Vous avez demandé une meilleure solution: NE le faites PAS! Mettre en œuvre des fonctions qui ont un sens basé sur ce que la classe est et représente, et que la classe d'invariants. Automatiquement la production de getters et setters expose la mise en œuvre interne, en violation de l'encapsulation.
struct
le fait par défaut.Beaucoup de réponses à la question suivante sont pertinentes: stackoverflow.com/questions/2977007/.... Bottom line: vous pouvez penser que vous voulez, mais c'est généralement une mauvaise idée.
Si la pratique de la programmation orientée objet vous oblige à faire quelque chose de stupide alors peut-être que la POO n'est pas la voie à suivre? La programmation orientée objet est un moyen pour une fin, pas un but en soi. L'objectif doit toujours être de bon, propre code. Ce n'est pas en quadruplant votre la taille du code et de l'écriture des getters/setters pour tout. (En dehors de cela, il n'est souvent pas bonne de la programmation orientée objet pratique pour ce faire. La classe doit exposer les opérations logiques qui ont du sens sur la classe. get/set ne sont généralement pas significatives des opérations, ils sont juste des raccourcis pour modifier les données internes de la classe.
Une classe pleine de getters et setters est l'antithèse de l'OO.
Vous avez demandé une meilleure solution: NE le faites PAS! Mettre en œuvre des fonctions qui ont un sens basé sur ce que la classe est et représente, et que la classe d'invariants. Automatiquement la production de getters et setters expose la mise en œuvre interne, en violation de l'encapsulation.
OriginalL'auteur Narek | 2010-06-05
Vous devez vous connecter pour publier un commentaire.
Pas l'outil, mais vous pouvez utiliser
Encapsulate Method
dans Visual Assist X, par exemple, ce qui rend getter /setter méthodes pour certains membre de classe privée.Sûr, de nombreux outils de travail similaire, comme VAX ont les mêmes méthodes.
Aussi, si vous avez à faire cette action pour une énorme quantité de classes, vous pouvez appliquer votre propre outil de ligne de commande et de sortie pour chaque fichier source que vous avez.
OriginalL'auteur Costantino Rupert
Pourquoi voulez-vous être la production de ces méthodes?
Généralement une meilleure approche est de faire une réelle utilisation de l'interface qui définit les opérations sur l'objet, pas seulement des ensembles d'attributs individuels. Par la création d'une interface de classe, vous éviter le besoin d'écrire un tas de getters et setters.
Si vous avez vraiment besoin de générer public getters et setters pour tous (ou même plus) de vos attributs, probablement mieux est de simplement faire une struct, cette production est nécessaire.
OriginalL'auteur Mark B
Si vous utilisez Visual Studio, mon Atomineer Pro De La Documentation add-faire - ce qu'il va ajouter instantanément des getter/setter pour un champ de membre, à l'aide d'un nommage style de votre choix.
par exemple, si vous avez ceci:
Ensuite, vous pouvez exécuter la commande pour convertir cette
(Note: vous n'avez pas à utiliser "m_" ou "aller à..." - c'est juste un exemple pour montrer comment il gère préfixé ou suffixé schémas de nommage. Vous pouvez configurer le membre de nommage style utilisé (vitesse, _speed, mSpeed, m_speed, etc) et la désignation de style pour les getter/setter (GetSpeed(), get_speed(), etc))
Il fait des choses similaires lorsqu'il est appliqué à un C# membre:
ensuite, vous pouvez exécuter la commande convertir une propriété automatique:
...et exécuter la commande une seconde fois pour produire une propriété avec un champ de stockage:
OriginalL'auteur Jason Williams
D'accord avec Kotti - Visual Assist (et d'autres compléments) fournir cette fonctionnalité.
Le code source doit avoir les getters /setters, parce que vous voulez probablement ajouter de validation et de notification de changement pour les setters en tant que de besoin.
L'aide d'une macro pour ce qui est juste... facepunchable. (disposé à élaborer sur demande).
OriginalL'auteur peterchen
Je n'ai pas trouvé un outil que j'ai écrit un script python en 10 minutes. Son n'est pas parfait, mais sa utile:
generate_getters.py :
Utilisation: > python generate_getters.py ClassName.h
Générer setter est laissé comme exercice pour le lecteur. 😉
OriginalL'auteur user18853