繁体   English   中英

在这种情况下,为什么不调用虚拟函数的实现?

[英]Why isn't my implementation of a virtual function being called in this case?

我可以访问实现虚拟方法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在其开始建造权,但它也给我GameEventHandler作为初始化参数,并且gameEventHandler不要么死(根据我的qDebug更改) :

GOManager_ = std::make_shared<ObjectManager>(playerAges_);
GEHandler_ = std::make_shared<GameEventHandler>(GOManager_);

事件处理程序的主窗口(或两者都应)应保持对象管理器处于活动状态,但它们不能...这是否是因为未提供此处所述的赋值运算符?

确保OBJECTMANAGER.lock()返回派生的ObjectManager类的实例。 如果返回的是iObjectManager(),它将调用其getTile()的基本版本,而不是重载的版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM