首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取基类指针的派生类

获取基类指针的派生类
EN

Stack Overflow用户
提问于 2016-02-15 10:03:19
回答 1查看 2.3K关注 0票数 0

我正在寻找一种将基类指针转换为派生类指针的方法,以访问其成员函数。我尝试过动态转换,但是当尝试将派生类函数打印到cout时,我的程序就停止工作了。

这是我的代码:

代码语言:javascript
复制
int main()
{
    Entity box;
    BoxObject box2(10, 10, 33, 2,BODYTYPE::dynamicBody);

    // adding my entities to my std::map
    g_pEntityManager->addEntity(std::make_unique<Entity>(box));
    g_pEntityManager->addEntity(std::make_unique<Entity>(box2));

    // get Entity with Entity* as return value
    // (1) is the unique id as key of my map
    Entity* ent = g_pEntityManager->getEntity(1);

    // casting Entity* to BoxObject* to be able to have access to derived- 
    // class member-functions
    BoxObject* boxi = dynamic_cast<BoxObject*>(ent);

    // when trying to cout public member function program crashes
    std::cout << boxi->getDimension().x << std::endl;
    return 0;
}

我需要知道如何正确地将基类指针转换为派生指针。我的基类Entity只拥有一个唯一的id来标识我的游戏中的对象(在我的第一个游戏引擎上工作;我对C++非常陌生),派生类将是玩家、瓷砖等等,具有比基类更多的功能。用我的地图,我的目标是有一个识别选项,将所有指向我的游戏对象的指针放在一个地方。因此,如果我有一个类实例的id,我就可以通过指针完全访问它的函数。

插入:

代码语言:javascript
复制
int EntityManager::addEntity(std::unique_ptr<Entity> gameObject)
{
    int size = m_EntityManager.size();
    gameObject->setID(size);
    // add entity-object to EntityManager and increment entity_id;
    m_EntityManager.insert(std::make_pair(size, std::move(gameObject)));
    std::cout << "Entity added! " << m_EntityManager.size() << std::endl;
    m_nEntityCounter ++;
    return size;
}

获取实体:

代码语言:javascript
复制
Entity* EntityManager::getEntity(int entityId)
{
    std::map<int, std::unique_ptr<Entity>>::iterator it = m_EntityManager.find(entityId);
    if (it != m_EntityManager.end())
    {
        if (it->second != nullptr)
        {
            std::cout << "GEt: " << it->second.get() << std::endl;
            return it->second.get();
        }
        else
        {
            std::cout << "Pointer to object is invalid!" << std::endl;
            return nullptr;
        }
    }
    else 
    {
        std::cout << "Couldn`t find Entity with id: " << entityId << " in EntityManager" << std::endl;
        return nullptr;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-15 10:14:12

在创建box2时,您实际上创建了一个Entity对象,如下所示:

g_pEntityManager->addEntity(std::make_unique<Entity>(box2));

相反,如果您想要派生类的对象(BoxObject),则需要创建这样的对象:

g_pEntityManager->addEntity(std::make_unique<BoxObject>(box2));

然后,可以如下所用:

代码语言:javascript
复制
Entity* ent = g_pEntityManager->getEntity(1);
BoxObject* boxi = dynamic_cast<BoxObject*>(ent);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35406391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档