我需要帮助尝试检索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....
}
}
答案 0 :(得分:0)
暂时不考虑当前代码的特定问题,我认为您的设计存在问题。
你有这个Singleton管理器类作为一种池,并且你也说为每个对象分配唯一的ID,以便以后可以找到它们。但是你知道什么让代码找到对象吗?指针!如果你使用一个普通的池,每个类型层次一个(所以没有更多的Boost Any),你可能会发现它同样有用,并且会有更少讨厌的if / else typeid-checking代码(每个人都会同意它不是很好用) RTTI,除了糟糕的OOP)。
那么,你怎么说?如果您希望从中心位置分配对象,并使用指针作为唯一ID,则使用Boost Pool,从而避免在此过程中进行查找。