我有一个类MemberBuilder,它为我构建从Member派生的类,其中一个是CommitteeMember。 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具有以下界面:
std::shared_ptr<Member> getMember(int memberID);
我得到了
"conversion from std::shared_ptr<CommitteeMember> to non-scalar type std::shared_ptr<Member> requested"
对我来说,似乎我做的完全相同,只是我第一次在同一个班级内调用它。如果在MemberBuilder本身被接受,我无法理解为什么我第二次收到错误。第二次没有触发错误的第二次我做错了什么? IIRC,如果用原始指针做这个,就不会有问题。
问:第二次失败有什么不同?答案 0 :(得分:2)
如错误所示,您正在使用不同的指针类型。 shared_ptr<CommitteeMember>
与shared_ptr<Member>
不同。你不能进行这种转换是件好事,因为引用计数不会被共享,你最终会遇到奇怪的对象生命周期行为。
要静态演员shared_ptr
,请查看std::static_pointer_cast<>()
。