我有一个类 MemberBuilder,它为我构建从 Member 派生的类,其中之一是 CommissionMember。 Member 是装饰器模式对象链的基类,这些对象是 Member 派生类的实例。
MemberBuilder 包含以下方法来为我创建委员会成员:
std::shared_ptr<CommitteeMember> MemberBuilder::createCommitteeMember(int memberID, int age, QString& name, QString& surName, Committee* committee)
{
return std::shared_ptr<CommitteeMember> (new CommitteeMember(memberID,age,name,surName, committee));
}
在同一个MemberBuilder的某些方法中,它包含以下几行:
std::shared_ptr<Member> result;
result = createNormalMember(memberID, age, name, surName);
然后再往下看:
std::shared_ptr<Member> newChild = createCommitteeMember(memberID, age, name, surName, commission);
result->addChild(newChild);
这不会产生任何编译器问题。
但是如果我在某个类中创建 std::shared_ptr mb 然后执行以下操作:
std::shared_ptr<Member> member = getMember(memberID);
std::shared_ptr<Member> newChild = mb->createCommitteeMember(memberID, age, name, surName, commission);
member->addChild(newChild);
getMember 有以下接口(interface):
std::shared_ptr<Member> getMember(int memberID);
我明白了
"conversion from std::shared_ptr<CommitteeMember> to non-scalar type std::shared_ptr<Member> requested"
对我来说,我似乎在做完全相同的事情,除了我第一次从同一个类中调用它。我不明白为什么如果 MemberBuilder 本身接受了它,我第二次会收到错误。我第二次做错了什么而第一次没有触发错误? IIRC,如果使用原始指针执行此操作,就不会有问题。
问:什么区别导致第二次失败?
最佳答案
正如错误所示,您正在使用不同的指针类型。 shared_ptr<CommitteeMember>
与 shared_ptr<Member>
不同。最好您不能执行此转换,因为引用计数不会共享,并且最终会出现奇怪的对象生命周期行为。
为了静态地转换 shared_ptr
,看std::static_pointer_cast<>()
.
关于c++ - shared_ptr 隐式转换在这里失败而在那里成功?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22984602/