我想在公共(public)容器中管理从共享接口(interface)类派生的类的一堆对象。
为了说明问题,假设我正在构建一个包含不同参与者的游戏。让我们调用接口(interface)IActor
并从中派生Enemy
和Civilian
。
现在,我的想法是让我的游戏主循环能够执行此操作:
// somewhere during init
std::vector<IActor> ActorList;
Enemy EvilGuy;
Civilian CoolGuy;
ActorList.push_back(EvilGuy);
ActorList.push_back(CoolGuy);
和
// main loop
while(!done) {
BOOST_FOREACH(IActor CurrentActor, ActorList) {
CurrentActor.Update();
CurrentActor.Draw();
}
}
...或类似的东西。这个例子显然行不通,但这正是我在这里提问的原因。
我想知道:在通用异构容器中管理这些对象的最佳、最安全、最高级别的方法是什么?我知道各种方法(Boost::Any、void*、带 boost::shared_ptr 的处理程序类、Boost.Pointer Container、dynamic_cast),但我无法决定使用哪种方法。
另外我想强调的是,我想尽可能远离手动内存管理或嵌套指针。
帮助非常感谢:)。
最佳答案
要解决您提到的问题,虽然您的方向是正确的,但您的做法是错误的。这是你需要做的
- 用虚函数定义一个基类(你已经在做),它会被派生类覆盖
Enemy
和Civilian
在你的情况下。 - 您需要选择合适的容器来存放您的元素。你拍了一张
std::vector<IActor>
这不是一个好的选择,因为- 首先,当您将对象添加到 vector 时,它会导致对象切片。这意味着只有
IActor
的一部分Enemy
或Civilian
正在存储而不是整个对象。 - 其次,您需要根据对象的类型 (
virtual functions
) 调用函数,这只有在您使用指针时才会发生。
- 首先,当您将对象添加到 vector 时,它会导致对象切片。这意味着只有
上述两个原因都表明您需要使用一个可以包含指针的容器,例如std::vector<IActor*>
。 .但更好的选择是使用 container of smart pointers
这将使您免于内存管理的麻烦。您可以根据需要使用任何智能指针(但不能使用 auto_ptr
)
这就是你的代码的样子
// somewhere during init
std::vector<some_smart_ptr<IActor> > ActorList;
ActorList.push_back(some_smart_ptr(new Enemy()));
ActorList.push_back(some_smart_ptr(new Civilian()));
和
// main loop
while(!done)
{
BOOST_FOREACH(some_smart_ptr<IActor> CurrentActor, ActorList)
{
CurrentActor->Update();
CurrentActor->Draw();
}
}
除了智能指针部分,这与您的原始代码非常相似
关于c++ - 将从公共(public)接口(interface)派生的类的对象存储在公共(public)容器中的最安全方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2489533/