如何从包含boost :: shared_ptr的std :: list中检索数据

时间:2012-02-09 18:13:24

标签: boost shared-ptr boost-any

我需要帮助尝试检索std::list<boost::shared_ptr<boost::any>>

中保存的数据

我在使用私有std::list的Singleton Controller类上工作。客户端类将能够通过此Controller类添加/删除/编辑程序使用的具体类对象。

使用boost::shared_ptr的原因是因为我为每个创建的具体类分配了一个唯一的objID。一旦将实例obj添加到控制器,用户将能够稍后搜索和删除obj。每个具体类的Add(....)Remove(...)重载方法都可以正常工作。

我现在正在努力创建getObject(int index)&amp; setObject(int index)方法,但似乎无法弄清楚如何将返回的指针强制转换为Concrete类。

请告知。

我目前的代码:

//===============================================================
//Singleton.h controller class
private:    
static Singleton *mgr;

typedef boost::shared_ptr<boost::any> Shapes_Ptr;
//private static list
static std::list<Shapes_Ptr> shapes; 

public:
const Shapes_Ptr getObject( int index) const;  //Return Shape
Shapes_Ptr EditObject( const int index );      //Edit Shape

Info();  //Prints contents of instance to console screen

//===============================================================
//Singleton.cpp 

//Return Shape
const Shapes_Ptr getObject( int index) const
{
    int cc = 0;

    if ( (int)shapes.size() > ZERO && index < (int)shapes.size() )
    {
        list<Shapes_Ptr>::const_iterator i;

        for ( i = shapes.begin(); i != shapes.end(); ++i )
        {
            if ( cc == index )
            {
                return (*i);
                break;
            } 
            else { ++cc; }
        }//for-loop 
    }   
}

//Edit Shape
Shapes_Ptr EditObject( const int index )
{
    //same code as getObject()...
}


//===============================================================
//main.cpp 

Singleton *contrl= Singleton::Instance();

int main()
{
    for ( int i=0; i< 2; ++i )
    {
        contrl->CreateObject(Box2D() );
    }

    for ( int i = contrl->Begin(); i< contrl->End(); ++i )
    {
        if ( boost::any_cast<boost::any> (contrl->getObject(i)).type() == typeid(Physics::Box2D) )
        {
            //Code compiles but crashes on launch....
            any_cast<Box2D> (contrl->getObject(i) ).Info(); // <== ERROR CODE
        }
        //More if checks for other Concrete classes....
    }
}

1 个答案:

答案 0 :(得分:0)

暂时不考虑当前代码的特定问题,我认为您的设计存在问题。

你有这个Singleton管理器类作为一种池,并且你也说为每个对象分配唯一的ID,以便以后可以找到它们。但是你知道什么让代码找到对象吗?指针!如果你使用一个普通的池,每个类型层次一个(所以没有更多的Boost Any),你可能会发现它同样有用,并且会有更少讨厌的if / else typeid-checking代码(每个人都会同意它不是很好用) RTTI,除了糟糕的OOP)。

那么,你怎么说?如果您希望从中心位置分配对象,并使用指针作为唯一ID,则使用Boost Pool,从而避免在此过程中进行查找。