繁体   English   中英

变量地址

[英]Variables addresses

我正在写统计系统。 它应该使用给定的参数进行一些输出。 例如:

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

看,每次更新都需要在所有传递的变量的新值中调用。 因此,我决定将它们的地址传递到内存中。 但是现在数据由地址组成。 我如何从中获得价值? 如果没有,您可能对此问题有何建议?

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

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

所有这些代码看起来都很奇怪。 地址操纵技术相当可疑,IMO。

我建议在这种情况下不要使用BOOST_FOREACH,因为对于代码阅读器来说,这可能会更难。 您可以使用普通的迭代器重写update函数:

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*作为map参数。 如果返回的值只是原始值(例如您的示例中的floatint ),为什么Sun返回float和Earth int 两者都应使用float / double

2)您正在访问静态方法轨道内的StatisticSystem类的成员,此成员无效且将无法编译。 如果您尝试实现Singleton模式,则有很多关于如何正确制作模式的教程,例如: http : //www.yolinux.com/TUTORIALS/C++Singleton.html。

3)您缺少函数的返回类型。 如果您希望函数不返回任何内容,请指定void作为其返回类型:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM