gpt4 book ai didi

c++ - 获取基类指针的派生类

转载 作者:行者123 更新时间:2023-11-28 02:11:50 25 4
gpt4 key购买 nike

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

这是我的代码:

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++ 的新手),派生类将成为玩家,比基类具有更多功能的瓷砖等。对于我的 map ,我的目标是有一个识别选项,将所有指向我的游戏对象的指针放在一个地方。因此,如果我有一个类实例的 ID,我就可以通过指针完全访问它的功能。

插入:

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;
}

获取实体:

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;
}
}

最佳答案

在创建 box2 时,您实际上是在创建 Entity 的对象,如下:

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

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

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

然后可以按如下方式使用:

Entity* ent = g_pEntityManager->getEntity(1);
BoxObject* boxi = dynamic_cast<BoxObject*>(ent);

关于c++ - 获取基类指针的派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35406391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com