我可以访问实现虚拟方法iObjectManager::getTile(const Course::ObjectId &id) = 0
的接口。我在继承的class ObjectManager:public Course::iObjectManager
中重新实现了上述方法,如下所示:
std::shared_ptr<Course::TileBase> getTile(const Course::ObjectId &id) override;
std::shared_ptr<Course::TileBase> ObjectManager::getTile(const Course::ObjectId &id)
{
qDebug() << "Looking for tile based on ID...\n";
for (unsigned i = 0; i < getMapSize(); i++) {
for (unsigned j = 0; j < getMapSize(); j++) {
std::shared_ptr<BoardPiece> tile = getGameMap().at(i).at(j);
if (tile->ID == id) {
qDebug() << "Tile found.\n";
return std::move(tile);
}
}
}
qDebug() << "No tile with given index...\n";
return nullptr;
}
当课程侧代码调用getTile
时,就会出现问题:什么也没有发生。不会进行对qDebug
的调用,并且不会打印任何内容。即使我正确地实现了该功能,为什么仍无法调用该函数(或缺少实现的那个)?
该函数的名称如下:
tile = lockObjectManager()->getTile(ID);
其中lockObjectManager
被定义为
std::shared_ptr<iObjectManager> GameObject::lockObjectManager() const
{
std::shared_ptr<iObjectManager> handler = OBJECTMANAGER.lock();
Q_ASSERT(handler);
return handler;
}
我刚刚发现,ObjectManager
在初始化之后就被销毁了。这很奇怪,因为我一开始就将其设置为MainWindow
的成员,但是它也作为初始化参数以及{{1} }也不会消失(根据我的GameEventHandler
年龄):
gameEventHandler
事件处理程序的主窗口(或两者都应)保持对象管理器处于活动状态,但是它们没有...这是因为我没有提供here所述的赋值运算符吗?>
答案 0 :(得分:1)
确保OBJECTMANAGER.lock()返回派生的ObjectManager类的实例。如果返回iObjectManager(),它将调用其getTile()的基本版本,而不是重载的版本。