2010-08-29 2 views
0

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

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

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

+0

Код хранения адрес временной переменной, которая не уедешь хорошо. – aschepler

ответ

-1

Я предлагаю не использовать 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 в вашем примере), почему Sun возвращает float и Earth int? Вы должны использовать float/double для обоих.

2) Вы получаете доступ к члену класса StatisticSystem внутри дорожки статического метода, это недопустимо и не будет компилироваться. Если вы пытаетесь внедрить шаблон Singleton, есть много руководств по его правильной настройке, например: http://www.yolinux.com/TUTORIALS/C++Singleton.html

3) Вам не нужны типы возвращаемых функций. Если вы хотите, чтобы функции не возвращать ничего, указать void в качестве типа возвращаемого значения:

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

Кто бы ни: почему отрицательный голос? Пожалуйста, добавьте комментарий с описанием недостатков в моем посте, спасибо. –

0

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

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

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

Смежные вопросы