我有一个基实体类和派生类,如牛和鸡......
using namespace std;
class Entity
{
list<shared_ptr<Relationship>> relationships;
void createRelationship(weak_ptr<Entity> other,.... other stuff)
//...
virtual ~Entity()
}
class Cow: public Entity
{
//...
}
class Chicken : public Entity
....etc...
我正在尝试学习使用 std 智能指针正确管理内存。我现在做事的方式,我的派生类唯一存在的地方是共享指针的向量,比如......
vector<shared_ptr<Cow>>
vector<shared_ptr<Chicken>>
etc.
我的 Entity 类负责管理任何两个实体之间的关系,无论它们是否具有相同的类型。为此,它保留了一个关系对象列表,看起来像......
class Relationship
{
weak_ptr<Entity> from;
weak_ptr<Entity> to;
etc....
}
我使用弱指针是因为牛或鸡可能会死,在这种情况下它们与其他实体的关系应该变得无效。
所以这是我的问题。我将所有内容存储为派生类的共享指针,但我的 Entity 类中的所有代码都使用指向基类的弱指针。我经常需要将弱实体指针转换为共享 Cow 指针或将共享 Cow 指针转换为弱实体指针。
不知何故,我的代码允许我在上面的 Entity 类的 createRelationship(...) 的参数中传递 shared_ptr 对象。我真的不知道为什么会编译,我想知道这样做是否有效。我是否应该手动将其转换为弱指针,然后使用 static_pointer_cast 进行转换?(我问这个是因为我已经读过将共享指针作为参数传递很慢,而且我担心这种情况正在发生)。
另一方面,有时我知道某些关系存在于两个相同类型的实体之间。为了说明我的观点,一头奶牛需要从其父母那里继承其基因:它搜索其关系以找到亲子关系,然后访问指向其父母的弱实体指针。为了访问它们的遗传成员变量,它需要将这些指向实体的弱指针转换为指向 Cows 的共享指针。我一直在使用 weak_ptr.lock() 后跟 dynamic_pointer_cast 来完成这个。
这是执行这两个(反向相关)强制转换的有效方法吗?任何一般性评论或参考资料都值得赞赏,因为我试图有效地使用这些指针。