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

标签 c++ smart-pointers

我有一个类 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/

相关文章:

rust - 遍历中RefCell的循环引用借用

c++ - 如何将 shared_ptr 从一个父类转换到另一个父类?

c++ - GetFileAttributes 不一致——为什么?

c++ - 带 swig 的 auto_ptr

当通过其中一个删除对象时,C++ 将所有指针设置为 null

c++ - 在初始化列表中使用复杂函数来初始化 const 成员是一个好的设计吗?

c++ - 从函数返回前释放 unique_ptr

c++ - 为不同的库包含相同的头文件

c++ - std::max 函数 VS '>' 运算符中 int 和 long long int 之间的最大值

c++ - 尝试使用 memcpy 复制数据,出现错误 "Access violation writing location"