我試圖創建一個基類(實體)的unique_ptr映射,其中只存儲唯一標識以標識我的對象。現在我想要創建不同的派生類(如玩家,平鋪等),它們應該從基類派生出來以獲得唯一的標識。獲取基類的指針以使用派生類的函數
如何將unique_ptr的內存位置作爲返回值傳遞,而不將其從我的地圖中移出?我的想法是在派生類傳入我的地圖時,使用基類的內存位置來訪問派生函數。
P.S. I'm目前正在對我自己的遊戲引擎(還是有點新CPP)
這是我目前的EntityManager WIP:
EntityManager.hpp
#pragma once
#include "TSingleton.hpp"
#include "Entity.hpp"
#include <map>
#include <iostream>
#include <memory>
#define g_pEntityManager EntityManager::Get()
class EntityManager : public TSingleton<EntityManager>
{
public:
EntityManager();
~EntityManager();
// add entity to entity-manager and returns id in entityManager
int addEntity(std::unique_ptr<Entity> gameObject);
// get pointer to entityManager
std::map<int, std::unique_ptr<Entity>> getEntityManager() { return m_EntityManager; };
// destroy entity
void killEntity(int entityId);
// get entity
std::unique_ptr<Entity> getEntity(int entityId);
private:
int m_nEntityCounter = 0;
std::map<int, std::unique_ptr<Entity>> m_EntityManager;
};
EntityManager.cpp
EntityManager::EntityManager()
{
}
EntityManager::~EntityManager()
{
}
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;
}
void EntityManager::killEntity(int entityId)
{
std::map<int, std::unique_ptr<Entity>>::iterator it = m_EntityManager.find(entityId);
if (it != m_EntityManager.end())
{
m_EntityManager.erase(it);
}
else
std::cout << "Couldn`t kill Entity with id: " << entityId << " , because there is no Entity with this id in EntityManager" << std::endl;
}
std::unique_ptr<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::unique_ptr<Entity>& found = it->second;
return std::move(found);
}
else
std::cout << "Pointer to object is NULL!" << std::endl;
}
else
std::cout << "Couldn`t find Entity with id: " << entityId << " in EntityManager" << std::endl;
}
您可以使用'std :: unique_ptr :: get'來檢索原始封裝指針。這是你要求的嗎? – paddy
你應該創建一個SSCCE來描述你想要做什麼,因爲它很不清楚。你是否試圖傳遞'unique_ptr'給其他人填充?或者你是否試圖繞過它所包含的價值而不傳遞所有權?如果是後者,也許你想'shared_ptr'。 – kfsone
我只是想獲得原始指針並希望能夠使用此原始指針訪問派生類的函數。 @paddy,是啊...試圖使用get()之前,但遺憾地忘記返回類型的實體*而不是std :: unique_ptr thy –
cFx