说我有这两个类:
class Object {
public:
virtual void update();
};
class Actor : public Object {
public:
void update();
}
还假设我正在创建actor
类的实例,如下所示:
class somethingElse {
public:
void init();
std::vector<Object*> objects;
}
void somethingElse::init()
{
Actor tmp;
Object * tmpo = &tmp;
objects.push_back(tmpo);
}
我稍后遍历objects
:
for (int i = 0; i < objects.size(); i++)
objects.at(i)->update();
在update()
的两个版本上放置一个断点,显示被调用的那个是object
类中的一个,而不是来自actor
类的那个。为什么会这样,有没有解决这个问题的方法呢?
答案 0 :(得分:2)
somethingElse::init()
Actor tmp
将超出范围并被销毁。指针将指向不再存在的对象。
new
可以在这里提供帮助,但使用智能指针会更安全,例如std::shared_ptr
:
#include <iostream>
#include <vector>
#include <memory>
class Object {
public:
virtual void update() { std::cout << "Object update()\n"; }
virtual ~Object() = default;
};
class Actor : public Object {
public:
void update() { std::cout << "Actor update()\n"; }
};
class somethingElse {
public:
void init();
std::vector<std::shared_ptr<Object>> objects;
};
void somethingElse::init()
{
//Actor tmp;
auto tmpo = std::make_shared<Actor>();
//Object * tmpo = &tmp;
objects.push_back(tmpo);
}
int main()
{
somethingElse objs;
objs.init();
auto& objects = objs.objects;
for(int i = 0; i < objects.size(); i++)
objects.at(i)->update();
}