2010-08-29 16 views
0

J'écris un système statistique. Il devrait faire une sortie avec des paramètres donnés. Par exemple:Adresses de variables

float getSunActivity() { ... } 
int getEarthActivity() { ... } 

StatisticSystem::track("sun_activity", boost::any(getSunActivity())); 
StatisticSystem::track("earth_activity", boost::any(getEarthActivity())); 

class StatisticSystem 
{ 
    typedef std::map<string, const boost::any*> stats; 
    stats mStatsData; 

    static void track(const string &name, const boost::any &param); 
    void update(); 
}; 

StaticSystem::track(const string &name, const boost::any &param) 
{ 
    mStatsData[name] = &param; 
} 

StaticSystem::update() 
{ 
    BOOST_FOREACH(stats::value_type &row, mStatsData) 
    { 
     string data = lexical_cast<string>(&row.second); 
     cout << data << "\n"; 
     // Usage of 'data' value 
    } 
} 

Regardez, chaque mise à jour appelant j'ai besoin dans la nouvelle valeur de toutes les variables passées. J'ai donc décidé de transmettre leurs adresses dans la mémoire. Mais maintenant les données se composent de l'adresse. Comment puis-je en recevoir de la valeur? Est-ce possible, sinon, que pourriez-vous conseiller pour ce problème?

+0

Le code stocke l'adresse d'une variable temporaire, qui ne vous mènera nulle part bien. – aschepler

Répondre

-1

Je suggère de ne pas utiliser BOOST_FOREACH dans ce cas, car il pourrait être plus difficile pour le lecteur du code de se tenir sous le capot. Vous pouvez réécrire la fonction de mise à jour en utilisant des itérateurs simples:

void StaticSystem::update() 
{ 
    for (stats::iterator it = mStatsData.begin(); it != mStatsData.end(); ++it) 
    { 
     string data = lexical_cast<string>(*it->second); 
     cout << data << "\n"; 
     // Usage of 'data' value 
    } 
} 

Cependant, cela ne suffira pas à faire fonctionner votre code. 1) N'utilisez pas boost :: any à moins que cela ne soit absolument nécessaire - c'est une classe de template lourde qui ralentit la compilation et ne donne aucune indication sur les types qui sont stockés à l'intérieur. Une meilleure approche serait de créer des classes EarthActivity et SunActivity qui dériveraient toutes deux d'une classe commune Activity, puis utiliseraient Activity* au lieu de boost::any* comme paramètre de carte. Dans le cas où les valeurs retournées ne sont que des primitives (comme les float et int dans votre exemple), pourquoi Sun renvoie-t-il float et Earth int? Vous devez utiliser float/double pour les deux.

2) Vous accédez à un membre de la classe StatisticSystem à l'intérieur de la piste de méthode statique, ceci est invalide et ne compilera pas. Si vous essayez d'implémenter un pattern Singleton, il y a beaucoup de tutoriels sur comment le faire correctement, par exemple celui-ci: http://www.yolinux.com/TUTORIALS/C++Singleton.html

3) Il vous manque des types de retour des fonctions. Si vous voulez que les fonctions de retourner rien, spécifiez void comme type de retour:

void functionReturningNothing() { /* ... */ } 
+0

À quiconque: pourquoi le vote négatif? S'il vous plaît ajouter un commentaire avec une description des défauts dans mon message, merci. –

0

Les données stockées à une adresse sont récupérées par l'opérateur unaire *.

Dans votre code, vous devriez avoir utilisé * row.second pour obtenir la valeur, plutôt que l'adresse de seconde.

Tout ce code a l'air bizarre. La technique de manipulation d'adresse est plutôt discutable, IMO.