如何从包含boost::shared\u ptr的std::列表中检索数据

如何从包含boost::shared\u ptr的std::列表中检索数据,boost,shared-ptr,boost-any,Boost,Shared Ptr,Boost Any,我需要帮助尝试检索保存在std::list 我正在使用私有的std::list处理单例控制器类。客户端类将能够通过该控制器类添加/删除/编辑程序使用的具体类对象 使用boost::shared_ptr的原因是我为创建的每个具体类分配了一个唯一的对象。一旦实例OBJ添加到控制器中,用户将能够在以后搜索和删除OBJ。每个具体类的Add(…)和Remove(…)重载方法可以很好地工作 我现在尝试创建getObject(int-index)&setObject(int-index)方法,但似乎不知道如何

我需要帮助尝试检索保存在
std::list

我正在使用私有的
std::list
处理单例控制器类。客户端类将能够通过该控制器类添加/删除/编辑程序使用的具体类对象

使用
boost::shared_ptr
的原因是我为创建的每个具体类分配了一个唯一的对象。一旦实例OBJ添加到控制器中,用户将能够在以后搜索和删除OBJ。每个具体类的
Add(…)
Remove(…)
重载方法可以很好地工作

我现在尝试创建
getObject(int-index)
&
setObject(int-index)
方法,但似乎不知道如何将返回的指针强制转换为具体的类

请告知

我当前的代码:

//===============================================================
//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....
    }
}
//===============================================================
//Singleton.h控制器类
私人:
静态单例*mgr;
typedef boost::共享的\u ptr形状\u ptr;
//私有静态列表
静态std::列表形状;
公众:
const Shapes_Ptr getObject(int index)const//返回形状
形状\u Ptr EditObject(const int index)//编辑形状
信息()//将实例的内容打印到控制台屏幕
//===============================================================
//Singleton.cpp
//返回形状
常量形状\u Ptr getObject(int index)常量
{
int cc=0;
如果((int)shapes.size()>零和索引<(int)shapes.size())
{
列表::常量迭代器i;
对于(i=shapes.begin();i!=shapes.end();+i)
{
if(cc==索引)
{
申报表(*i);
打破
} 
else{++cc;}
}//for循环
}   
}
//编辑形状
形状\u Ptr EditObject(常量整数索引)
{
//与getObject()相同的代码。。。
}
//===============================================================
//main.cpp
Singleton*contrl=Singleton::Instance();
int main()
{
对于(int i=0;i<2;++i)
{
contrl->CreateObject(Box2D());
}
对于(int i=controll->Begin();iEnd();++i)
{
if(boost::any_cast(controll->getObject(i)).type()==typeid(Physics::Box2D))
{
//代码编译但在启动时崩溃。。。。

不管当前代码存在什么问题,我认为您的设计存在问题

您有一个单例管理器类,它充当一种池,并且正如您所说,为每个对象分配唯一的ID,以便以后可以找到它们。但是您知道什么让代码找到对象?指针!如果您使用普通池,则每个类型层次结构一个(因此不再有任何提升),您可能会发现它同样有用,而且会有不那么讨厌的if/else类型ID检查代码(每个人都会同意,除了糟糕的OOP之外,这不是RTTI的好用途)


那么,你说呢?扔掉这个,如果你想从一个中心位置分配你的对象,就使用Boost Pool,并使用指针作为你的唯一ID,这样就避免了一路上的查找。

你能解释一下你想完成什么吗?你试过在调试器中运行你现有的代码吗?@John-是的,我已经在中运行了这个项目调试模式。我收到一个异常错误
bad_cast
我正在尝试为私有
std::list
创建一个getter/setter,以便我可以迭代和打印数据,以及能够为列表中每个元素中的每个数据成员调用setter。如果有一种干净或更好的方法公开列表元素,请建议。那么这段代码有什么用呢?为什么你想要一个不知道它包含什么类型的单例,但仍然包含它们?@John-我正在尝试实现一个模型视图控制器。单例是控制器,一个网关,用来管理创建了多少个对象的实例,另外它还分配了唯一的ID,所以clients可以搜索。你能提供一个编译的例子吗?我觉得这是你实际的
任何类型(control->getObject(I))
getObject
返回一个
Shapes\u Ptr
而不是
Box2D
。它可能很简单,只要更改为
任何类型(control->getObject(I).get())
,但如果没有一个可以编译的例子,我无法检验这个假设。也就是说,如果我是你,我会在下面研究约翰的答案。