调用子方法 在我的C++项目中,我有一个叫做陷阱的类。陷阱是NPC,NPC是实体。现在我想循环浏览所有NPC,并用它们做一些事情。例如,我想更新一个陷阱。我是这样做的 for (vector<NPC>::iterator it = Enemies.begin(); it != Enemies.end(); ++it) { it->Update(); } for(vector::iterator it=buzzers.begin();it!=buzzers.end();++it){ 它->更新(); }

调用子方法 在我的C++项目中,我有一个叫做陷阱的类。陷阱是NPC,NPC是实体。现在我想循环浏览所有NPC,并用它们做一些事情。例如,我想更新一个陷阱。我是这样做的 for (vector<NPC>::iterator it = Enemies.begin(); it != Enemies.end(); ++it) { it->Update(); } for(vector::iterator it=buzzers.begin();it!=buzzers.end();++it){ 它->更新(); },c++,abstraction,object-slicing,C++,Abstraction,Object Slicing,但是现在Update()调用正在调用NPC::Update()方法 我相信这是因为我使用迭代器的方式,但我不知道如何更好地做到这一点。使用不同类型的迭代?有什么简单的技巧吗?你有问题 敌人应该是std::vector(或其他智能指针)或std::vector 您有问题 敌人应该是std::vector(或其他智能指针)或std::vector 您需要的是一个纯虚拟基类,它定义了派生类的所有基本函数。然后,您可以在子类中实现实际代码,并且仍然可以通过基类调用update()方法 cla

但是现在Update()调用正在调用NPC::Update()方法

我相信这是因为我使用迭代器的方式,但我不知道如何更好地做到这一点。使用不同类型的迭代?有什么简单的技巧吗?

你有问题

敌人
应该是
std::vector
(或其他智能指针)或
std::vector

    • 您有问题

      敌人
      应该是
      std::vector
      (或其他智能指针)或
      std::vector


      您需要的是一个纯虚拟基类,它定义了派生类的所有基本函数。然后,您可以在子类中实现实际代码,并且仍然可以通过基类调用update()方法

      class Base
      {
          virtual void update() = 0
      }
      
      class Implementation: public Base
      {
          void update() { /*Do stuff*/ }
      }
      

      接下来,创建一个
      向量
      (您需要的任何指针类型)并用
      新建(实现)
      填充它,然后您可以在向量中循环并执行
      Base->update()

      您需要的是一个纯虚拟基类,它定义派生类的所有基本函数。然后,您可以在子类中实现实际代码,并且仍然可以通过基类调用update()方法

      class Base
      {
          virtual void update() = 0
      }
      
      class Implementation: public Base
      {
          void update() { /*Do stuff*/ }
      }
      

      接下来创建一个
      向量
      (您需要的任何指针类型)并用
      新建(实现)
      填充它,然后您可以循环遍历您的向量并执行
      基本->更新()

      您可能应该注意OP应该使用
      std::vector::iterator
      或C++11之类的东西(foreach循环或
      auto
      type for it)来处理NPC。我尝试了这个方法,但它产生了两个新问题……第一个问题是我在以后迭代它们时遇到了问题。for循环同样容易工作,但以下方法不起作用。*it->Update()第二,通过存储指针而不是对象,NPC的分配在栈的末尾…我必须进一步研究它。@ OZIIHOHO:我已经添加了Stink链接(使用C++ 11)。你需要通过继承= C++中的运行时多态性。你必须使用任何指针(在这种情况下请使用StaskToor指针)。或者引用。当您在std::vector中存储值时,您放入的内容将被切片到基类实例。我不理解您“取消分配”的问题NPC。你能发布一个更完整的例子吗?我们对你如何创建对象感兴趣。@Jarod42哇,这些例子真是太棒了。非常感谢,这解决了我所有的问题。你可能应该注意OP应该使用
      std::vector::iterator
      或C++11东西(foreach循环或
      auto
      类型)处理NPC。我尝试了这个方法,但它产生了两个新问题…第一个问题是我在以后迭代它们时遇到了问题。for循环同样容易工作,但以下方法不起作用。*it->Update()第二,通过存储指针而不是对象,NPC的分配在栈的末尾…我必须进一步研究它。@ OZIIHOHO:我已经添加了Stink链接(使用C++ 11)。你需要通过继承= C++中的运行时多态性。你必须使用任何指针(在这种情况下请使用StaskToor指针)。或者引用。当您在std::vector中存储值时,您放入的内容将被切片到基类实例。我不理解您“取消分配”的问题NPC。你能发布一个更完整的例子吗?我们对你如何创建对象很感兴趣。@Jarod42哇,这些例子真是太棒了。非常感谢,这解决了我所有的问题。你可能更喜欢
      std::make_unique
      而不是
      新的实现
      。是的,很好的建议,那会更好。尽管我不得不做广告d这是一个C++14函数,所以需要一个最新的编译器。你可能更喜欢
      std::make_unique
      而不是
      新的实现
      。是的,建议不错,那会更好。虽然我不得不添加它是一个C++14函数,所以需要一个最新的编译器。