J'envisage de l'utilisation de C ++ pour un projet personnel. J'aimerais y faire une plateforme de la plate-forme (pas de mono s'il vous plaît, car certaines plates-formes ne l'appuient pas encore), et c'est pourquoi j'ai considéré C ++. P>
J'ai un doute, cependant. J'ai beaucoup aimé les attributs de C # et j'aimerais savoir si je peux utiliser quelque chose de similaire en C ++. P>
Aussi, est-il possible d'utiliser le motif de décorateur pour cela? P>
Edit: J'envisagerais maintenant d'autres possibilités ou approximations à ce sujet, c'est-à-dire. un moyen de joindre un comportement supplémentaire à une classe en runtime. p>
Edit 2: Java n'est pas une option, car certains appareils que je voudrais le porter pour ne pas prendre en charge Java. P>
9 Réponses :
pour les attributs de classe, oui. Définissez simplement une classe de base appelée attributs pour stocker les informations d'attribut et hériter de toute classe qui nécessite des attributs. Vous pouvez interroger pour cela en utilisant RTTI CAST. P>
mais pour les attributs de méthode ou de paramètre, c'est essentiellement pas une option. P>
AS que c ++ prend en charge plusieurs héritages ajoutant plusieurs attributs est facile :) Ceci est cependant alors lié aux instances que je suppose
C ++ 0x prendra en charge les attributs limités. Mais je doute que cela vous aide avec votre projet actuel, ou même vos prochains projets (ce ne sera pas ici pendant un moment).
Je vais répondre en supposant que vous parlez de propriétés, une fonctionnalité que j'ai Souvent convoité. P>
Vous pouvez un peu soutenir des propriétés. Une implation générale de cela serait un peu plus complexe. Mais pour un offs, il peut être facile p> i ignoré conscroiness pour le souci de brièveté. P> p>
Le commentaire de Changelog le rend assez clair qu'il s'agit d'attributs, pas de propriétés.
Il y avait une course entre la clarification de Changelog et ma réponse. C'est un excellent exemple pourquoi la programmation multithreadée est difficile.
La programmation multithreadée est difficile. Laisse faire du shopping! Maintenant sérieusement, des idées?
C'est vraiment créatif
Les attributs décrivent les métadonnées. Vous pouvez le faire «manuellement» en héritant d'une classe de base qui définit un référentiel de «descriptions» pour des pièces de classe comme des méthodes. Vous auriez besoin des noms des pièces au moment de la compilation.
class whatever { public: static map<string, string> attribute_repository; }
Dans l'exemple MVC, vous vous référez, les attributs de méthode sont utilisés via une réflexion. Étant donné que C ++ n'a aucune réflexion, vous pouvez envisager d'utiliser la génération de code à la place: une sorte de langage de définition d'interface et un générateur produisant C ++ Code. Dans ce scénario, vous êtes libre d'ajouter un concept d'attribut à votre langue d'interface et de rendre le générateur traduire les attributs de manière appropriée. P>
Un excellent exemple est Google Tampons de protocole : il y a un Évidemment, l'approche de génération de code n'est pas facile à mettre en œuvre, mais elle peut produire des solutions très efficaces. P>
Votre réponse suggère une approche de métaprogrammation de modèle pourraient éviter le besoin de générateur de code externe.
demandez-vous une programmation orientée forme? AspectC ++ est actuellement juste un prototype de recherche :( http://www.aspectc.org/ p>
Une idée sur la façon de "simuler" un attribut de classe à l'aide de modèles de spécialisation: La mise en oeuvre par défaut des attributs sera prise en charge par le compilateur pour une classe sans attributs: p> Si nous voulons appliquer les attributs à une classe, nous utilisons la spécialisation de modèle: p> Nous devons appliquer (modèle- Spécialiser) Les attributs de chaque classe que nous voulons qu'ils soient appliqués à: p> exemple: p> de cette manière Les attributs sont "appliqués" à la classe et non à l'instance comme avec plusieurs héritage; La différence fondamentale, de toute façon, est que, dans ce cas, les attributs sont évalués à l'heure de la compilation et non au moment de l'exécution. P> Répondre à cette question a été amusant pour moi; En tout cas, je pense que le meilleur conseil sur le sujet est que vous ne devriez pas essayer de programmer en C ++ comme si c'était C #. En tout cas, codage heureux! p> p>
Dans ce cas, comment appliquer-vous plusieurs attributs à une classe? Ou les classes doivent-elles être appliquées à l'attribut?
L'idée est d'avoir les attributs appliqués à plusieurs classes. Imaginez, si vous voulez, un attribut rare pour une classe d'articles.
Un article n'exigerait-il pas une propriété de rareté I> - car différentes instances d'article (épée, pièces d'or) pourraient avoir différentes rareté?
Construisez-vous un pré-processeur qui transforme un attribut comme la syntaxe en propriétés réelles et les méthodes. P>
J'avais lu un article sur codeProject à propos de ce numéro: C ++ Mise en œuvre de la propriété C # et de l'indexeur avec des modificateurs d'accessores . Je crois que c'est ce que tu veux. P>
Êtes-vous peut-être moyen des propriétés, avec le code d'obtenir et de définir? Ou faites-vous vraiment référence aux attributs (c'est-à-dire des sous-classes du système.Attribute)? Si oui, quels attributs spécifiques vous intéressent-il?
Stackoverflow.com/questions/283209 / ... Vérifiez cette URL pour un exemple de ce que je veux faire (mais en C ++)
Re: la partie sur "Joindre un comportement d'addition à une classe d'exécution" - Les attributs ne sont pas réellement capables de le faire en C #. Ce ne sont que des informations supplémentaires sur un type, rassemblées au moment de la compilation et ainsi congelées totalement gelées au moment de l'exécution. Autre code à Runtime est capable de lire les attributs et d'ajuster son comportement en conséquence.
Peut-être devriez-vous donner un exemple rapide de la manière dont vous aimez utiliser des attributs en C #?
Si vous voulez que votre projet soit indépendant de la plate-forme, pourquoi ne pas considérer Java? Si vous ne l'avez pas déjà appris, l'utilisation de Java pour un projet personnel est un excellent moyen de le faire.
@Liao, cela devrait être une réponse.
@Kellls, tu as raison. Mais quelqu'un m'a tellement évanoui, j'ai décidé de jouer en sécurité.