c++ - 将从公共(public)接口(interface)派生的类的对象存储在公共(public)容器中的最安全方法是什么?

标签 c++ interface containers heterogeneous

我想在公共(public)容器中管理从共享接口(interface)类派生的类的一堆对象。

为了说明问题,假设我正在构建一个包含不同参与者的游戏。让我们调用接口(interface)IActor 并从中派生EnemyCivilian

现在,我的想法是让我的游戏主循环能够执行此操作:

// 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),但我无法决定使用哪种方法。

另外我想强调的是,我想尽可能远离手动内存管理或嵌套指针。

帮助非常感谢:)。

最佳答案

要解决您提到的问题,虽然您的方向是正确的,但您的做法是错误的。这是你需要做的

  • 用虚函数定义一个基类(你已经在做),它会被派生类覆盖EnemyCivilian在你的情况下。
  • 您需要选择合适的容器来存放您的元素。你拍了一张std::vector<IActor>这不是一个好的选择,因为
    • 首先,当您将对象添加到 vector 时,它会导致对象切片。这意味着只有 IActor的一部分 EnemyCivilian正在存储而不是整个对象。
    • 其次,您需要根据对象的类型 (virtual functions) 调用函数,这只有在您使用指针时才会发生。

上述两个原因都表明您需要使用一个可以包含指针的容器,例如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/

相关文章:

c++ - 如何生成仅包含 1 到 6 数字的 4 位数字?

json - 在不使用结构的情况下将 json 转换为 map slice 并将 map slice 转换为 json

docker - 如何将目录从远程主机复制到docker镜像

c++ - 哪些 Boost 功能与 C++11 重叠?

c++ - 无法使用 Visual Studio 打开包含文件

go - 类型断言会改变go中的值吗?

containers - 我们什么时候应该使用 Indefinite_Hashed_Maps 或 Hashed_Maps

css - 如何使容器宽度为 960px - 在 bootstrap 3 上固定

C++作业帮(画个木棍房子包括/\)

java - 无法访问在 Java 接口(interface)中声明的常量/最终字符串数组值