Адреса переменных - PullRequest
       30

Адреса переменных

0 голосов
/ 30 августа 2010

Я пишу статистическую систему. Он должен сделать вывод с заданными параметрами. Например:

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
    }
}

Смотрите, каждое обновление вызывает меня в новом значении всех переданных переменных Поэтому я решил передать их адреса в память. Но теперь данные состоят из адреса. Как я могу получить ценность от этого? Возможно ли, если нет, что бы вы посоветовали для этой проблемы?

Ответы [ 2 ]

0 голосов
/ 30 августа 2010

Я предлагаю не использовать BOOST_FOREACH в этом случае, поскольку читателю кода может быть несколько сложнее, что происходит под капотом.Вы можете переписать функцию обновления, используя простые итераторы:

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
    }
}

Однако, это само по себе не заставит ваш код работать.Есть некоторые другие ошибки / плохой дизайн:1) Не используйте boost :: any, если в этом нет полной необходимости - это тяжелый шаблонный класс, который замедляет компиляцию и не дает подсказки, какие фактические типы хранятся внутри.Лучшим подходом было бы создание классов EarthActivity и SunActivity, которые оба были бы производными от общего класса Activity, а затем использовали бы Activity* вместо boost::any* в качестве параметра карты.Если возвращаемые значения являются только примитивными (например, float и int в вашем примере), почему Солнце возвращает float и Землю int?Вы должны использовать float / double для обоих.2) Вы обращаетесь к члену класса StatisticSystem внутри дорожки статического метода, это недопустимо и не будет компилироваться.Если вы пытаетесь реализовать шаблон Singleton, существует множество учебных пособий о том, как сделать его правильно, например, этот: http://www.yolinux.com/TUTORIALS/C++Singleton.html3) Вам не хватает возвращаемых типов функций.Если вы хотите, чтобы функции ничего не возвращали, укажите void в качестве типа возврата:

void functionReturningNothing() { /* ... */ }
0 голосов
/ 30 августа 2010

Данные, хранящиеся по адресу, извлекаются унарным оператором *.

В вашем коде вы должны были использовать * row.second для получения значения, а не адрес секунды.

Весь этот код выглядит странно, хотя.Техника манипулирования адресом довольно сомнительна, ИМО.

...