2010-09-13 15 views
1

Je me demande s'il est possible d'accéder dynamiquement à une propriété d'une classe sans connaître le nom de la propriété accédée lors de l'exécution.C++: Accès dynamique aux propriétés de classe

Pour vous donner une meilleure compréhension de ce que je vise, ce code php doit démontrer ce que je veux faire:

<?php 
$object = new object(); 
$property = get_name_out_of_textfile(); 
echo $object->$property; 
?> 

Je sais que est-il pas possible de faire exactement la même chose, mais disons que j'ai le nom d'un attribut dans une chaîne de std :: string et que je veux accéder à l'attribut correspondant au nom. Y-a-t-il un moyen de faire ça? L'arrière-plan est que je veux charger dynamiquement et enregistrer des données d'une classe avec beaucoup d'attributs. Je peux enregistrer le dans n'importe quel format, mais j'ai besoin d'un moyen de les recharger sans spécifier l'attribut exact à chaque fois. Merci d'avance pour toute aide, Robin.

Répondre

5

Fondamentalement, vous devez créer une fonction supplémentaire, ala:

std::string get(const std::string& field, const std::string& value_representation) 
{ 
    std::ostringstream oss; 
    if (field == "a") 
     oss << a; 
    else if (field == "b") 
     oss << b; 
    else 
     throw Not_Happy("whada ya want"); 
    return oss.str(); 
} 

Il existe de nombreux frameworks existants, tels que la bibliothèque de sérialisation boost. La plupart impliquent de déclarer votre classe en utilisant une sorte de balisage, ou pire - des métadonnées secondaires délocalisées. Si vous avez vraiment besoin de quelque chose de moins invasif, des outils tels que Gcc-XML et OpenC++ vous permettent d'automatiser la génération de ces fonctions (la première peut facilement être combinée avec des bibliothèques XML, un peu de python ou de ruby, mais faible gain de performance).

Juste pour être absolument clair, C++ ne fournit pas de manière automatisée, conforme à la norme pour ce faire. Aucun compilateur populaire ne fournit d'extensions pour cela. En cas de désintégration, vous pourriez être en mesure d'analyser vos propres informations de débogage, mais ce n'est certainement pas recommandé.

+0

Merci pour votre explication détaillée, qui l'éclaircit. Je vais jeter un coup d'oeil à certaines des implémentations que vous avez mentionnées. – Robin

2

Si la sérialisation est votre principale préoccupation, jetez un oeil à des solutions existantes comme Boost.Serialization qui opte pour une approche en streaming:

// save data to archive: 
// create and open a character archive for output 
std::ofstream ofs("filename"); 
boost::archive::text_oarchive oa(ofs); 
// write class instance to archive 
oa << myInstance; 

// ... 

// restore data from archive: 
// create and open an archive for input 
std::ifstream ifs("filename"); 
boost::archive::text_iarchive ia(ifs); 
// read class state from archive 
ia >> myInstance; 
+0

Merci pour votre réponse, mais ce n'est pas seulement à propos de cela, c'est aussi sur la connaissance si quelque chose comme ça est possible en ce qui concerne mes projets futurs. – Robin

2

Oui c'est possible ... Python, php, etc ... sont implémentés sur C ou C++, et ils l'offrent.

Mais c'est aussi extrêmement gênant. Ce que vous demandez, la possibilité d'inspecter un type lors de l'exécution, s'appelle introspection. C'est difficile à mettre en place, donc vu la façon dont vous avez formulé votre question ... n'y pensez pas encore, vous avez besoin de plus d'expérience.

Si vous voulez introspection, pensez à une autre langue, vraiment.