调用子方法 在我的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){ 它->更新(); }
但是现在Update()调用正在调用NPC::Update()方法 我相信这是因为我使用迭代器的方式,但我不知道如何更好地做到这一点。使用不同类型的迭代?有什么简单的技巧吗?你有问题调用子方法 在我的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
敌人
应该是std::vector
(或其他智能指针)或std::vector
- 您有问题
敌人
应该是std::vector
(或其他智能指针)或std::vector
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函数,所以需要一个最新的编译器。