作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Entity
由 lib 和 Registry
定义的类这是管理使用 map 注册到它的实体的类。
我正在尝试做的事情:
//Registry Signature
void Registry::add(Entity* entity);
//my function (IGameEntity subclasses Entity)
void GameLogic::addEntity(shared_ptr<IGameEntity> entity, GameEntityId id) {
GameEntityId entityId = entity->getId();
gameEntities.push_back(entity);
Framework::Registry::instance()->add(entity); //<-- this doesn't work
}
我正在想办法解决这个问题,因为我保留了 shared_ptr,然后我将不得不传递一个指针。
另一件事是,如果注册表由于某种原因被破坏,它将调用 delete
在 map 中剩余的所有实体上。
如果我通过 entity
有weak_ptr<Entity>(entity)
它有效,但我没有完全理解如果 Registry
会发生什么在 weak_ptr 上调用 delete。
如果我通过 entity
有entity.get()
当引用计数达到零或注册表试图删除它时会发生什么。
最佳答案
您有两个不兼容的所有权方案。
您需要更改其中一个,或者克隆应该从一种方案转移到另一种方案的对象。
当只有一个对对象的引用时,有一个释放 shared_ptr
的技巧。但你不想那样做。即使您对图书馆的内部情况了解得足够多也可以做到这一点。
因此,作为一个实用的解决方案,更改注册表。
让它接受一个shared_ptr
。
关于c++ - 如何将 shared_ptr 传递给 naked ptr 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12761960/
我是一名优秀的程序员,十分优秀!