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

看,每次更新调用我都需要在所有传递的变量的新值中。所以我决定在内存中传递他们的地址。但现在数据由地址组成。我怎样才能从中获得价值?有没有可能,如果没有,你对这个问题有什么建议?

4

2 回答 2

0

存储在地址中的数据由一元运算符*检索。

在您的代码中,您应该使用 *row.second 来获取值,而不是第二个的地址。

不过,所有这些代码看起来都很奇怪。IMO,地址操作技术相当值得怀疑。

于 2010-08-30T07:16:09.480 回答
-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 - 这是一个沉重的模板类,会减慢编译速度,并且不会提示其中存储了哪些实际类型。更好的方法是创建类EarthActivitySunActivity它们都从一个公共类派生Activity,然后使用Activity*而不是boost::any*作为映射参数。如果返回的值只是原始值(如您的示例中的floatand int),为什么 Sun 返回float和 Earth int?您应该对两者都使用float/ double

2)您正在访问班级的成员StatisticSystem在静态方法轨道内,这是无效的,不会编译。如果您正在尝试实现单例模式,有很多关于如何正确制作的教程,例如这个:http

://www.yolinux.com/TUTORIALS/C++Singleton.html 3) 你是缺少函数的返回类型。如果您希望函数不返回任何内容,请指定void它们的返回类型:

void functionReturningNothing() { /* ... */ }
于 2010-08-30T07:29:42.363 回答