gpt4 book ai didi

c++ - shared_ptr 隐式转换在这里失败并在那里成功?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:44:59 25 4
gpt4 key购买 nike

我有一个 MemberBuilder 类,它为我构建从 Member 派生的类,其中之一是 CommitteeMember。 Member 是对象装饰器模式链的基类,这些对象是 Member 派生类的实例。

MemberBuilder 包含以下为我创建 CommitteeMember 的方法:

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"

对我来说,我似乎在做完全相同的事情,只是我第一次从同一个类(class)中调用它。如果 MemberBuilder 本身接受它,我不明白为什么我第二次收到错误。我第二次没有在第一次触发错误时做错了什么?IIRC,如果使用原始指针执行此操作,就不会有问题。

Q:有什么不同导致第二次失败?

最佳答案

如错误所述,您正在使用不同的指针类型。 shared_ptr<CommitteeMember>shared_ptr<Member> 不同.您不能进行这种转换是件好事,因为引用计数不会共享,您最终会遇到奇怪的对象生命周期行为。

为了静态转换一个shared_ptr ,看std::static_pointer_cast<>() .

关于c++ - shared_ptr 隐式转换在这里失败并在那里成功?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22984602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com