2010-10-05 13 views
1

Donc, disons, dans une classe en C++, j'ai une variété de variables membres. Structs, ficelles, ints, etc. etc. Peut être n'importe quoi. Ces variables peuvent ou ne peuvent pas être définies par l'initialisation de l'objet de cette classe. Étant donné int a, float b, char c, parfois tous ou aucun d'eux ne peut être défini. Lorsqu'ils sont définis, ils peuvent être définis sur n'importe quelle valeur possible de la variable. Je voudrais trouver un moyen de réglage, et déterminer si une variable a été définie ou non:Déterminer si une variable non-objet est initialisée en C++

1) Beaucoup de coulée. Je pourrais toujours créer une classe de décorateur Data_Value qui a un booléen, et le modéliser à n'importe quelle variable donnée. Cela nécessiterait d'appeler a_data_value.value et a_data_value.isInitialized.

2) Beaucoup de variables booléennes supplémentaires. Je préfère ne pas avoir bool a_initialized, bool b_initialized.

Ce que je voudrais vraiment faire est quelque chose comme ceci:

Python add to a function dynamically

en C++, avec tout et toutes les variables, y compris les primitives. Grand ordre que je connais, et je m'attends à la réponse pessimiste.

+1

Avez-vous un problème avec l'utilisation du constructeur pour cela? – JoshD

+0

Avez-vous besoin d'utiliser C++ pour ce projet? Si une langue dynamique (ou une langue avec introspection) est mieux adaptée au problème, peut-être la meilleure approche est d'en utiliser un. – nmichaels

+0

Si vous pouviez expliquer pourquoi vous le souhaitez, nous pourrions peut-être vous proposer des solutions alternatives. – JoshD

Répondre

2

Vous avez raison. Il est impossible de déterminer à l'exécution si une primitive est "définie". Certains compilateurs vous avertiront dans certains cas d'utilisation de valeurs non initialisées, mais cela n'est pas du tout garanti.

+0

... car toutes les primitives ont une valeur * quelconque * tout le temps. Ils * n'ont * pas d'état défini/non défini. En fait, tous les membres de données d'une classe ou d'une structure ont également cette propriété, mais vous pouvez intégrer un indicateur set-ness si vous en avez besoin. – dmckee

+0

@dmckee, c'est pourquoi "set" est entre guillemets. Plus précisément, les variables non initialisées ont une valeur indéterminée (§8.5/11), et il est impossible de déterminer si une valeur est indéterminée. :) –

0

Supposons que vous ayez

class Bob { 
int a; 
int b; 
double c; 
complex<double> d; 
Bob() : a(), b(), c(), d() {} 
}; 

Lorsque vous créez un nouveau Bob, tout sera réglé par défaut (zéro dans ce cas).

Il n'y a pas d'état défini ou non défini pour les types primitifs. Ils ont toujours de la valeur.

0

Si vous voulez réécrire Python en C++, vous pouvez.

Vous auriez besoin d'une classe unordered_map efficace associée à une chaîne. La chaîne serait le nom de la variable.

Chaque valeur de variable serait une classe (appelons-la VARIANT, heh) pouvant contenir n'importe quelle valeur primitive.

Ensuite, au lieu d'une structure C++ vous feriez votre "struct" être une instance de votre unordered_map aka dictionary.

Si le nom de la variable est trouvé dans le dictionnaire, il a été défini et vous pouvez renvoyer la valeur. S'il n'est pas trouvé, il n'a jamais été défini.

Si vous souhaitez référencer vos clés de dictionnaire par nom à partir de C++ vous voulez utiliser les éléments suivants pour l'efficacité:

Au lieu de:

VARIANT v = dict["name"]; 

Utilisation:

static const std::string name_key("name"); 
VARIANT v = dict[name_key]; 

De cette façon, au lieu de construire une chaîne std :: string contenant "nom" pour la recherche de clé à chaque fois dans la fonction, cela sera fait une seule fois.

Questions connexes